Java中的协变

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tianzhen3299/article/details/84091305
[color=indigo]java中的协变表现为三方面:[/color]

1. 对于自定义对象的数组,可以将子类的数组直接转化为父类的数组。
如:

ConcreteUser2[] userArray = new ConcreteUser2[]{};
UserParent[] parents = new UserParent[]{};
parents = userArray;


2. 可以在子类中重写父类的返回父类类型的方法,子类返回的是子类的类型。
如:

public class UserParent {
public UserParent getUser()
{
System.out.println("parent");
return new UserParent();
}
}
public class ConcreteUser extends UserParent {
public ConcreteUser getUser()
{
System.out.println("child");
return new ConcreteUser2();
}
}

注:在一般的方法中,如果一个类中定义了两个方法,这两个方法的参数个数和类型
都相同,仅仅是返回类型不同的话,是不被允许的。因为这样算是重复的方法,不算
是方法的重写或重载。
但是对于继承关系的类,则属于协变。即凡是子类出现的地方都可以被父类取代。
3. 在泛型中,像1那种情况是不允许的。只能手动转换

List<ConcreteUser2> childList = new ArrayList<ConcreteUser2>();
List<UserParent> parentList = new ArrayList<UserParent>();
parentList = childList;(错误)
展开阅读全文

C#的委托如何实现JAVA中的

12-27

rnrnC#中如何实现JAVA中的协变?rnrn最近需要将JAVA代码改写成C#,但是在处理中遇到了协变的问题,原始的JAVA代码是这样的:rn基类:rnpublic abstract class DataElement rn public abstract boolean equals(DataElement otherElement);rn public abstract int compareTo(DataElement otherElement);rn public abstract void makeCopy(DataElement otherElement);rn public abstract DataElement getCopy();rn public abstract DataElement properSlot(DataElement searchItem);rnrn子类(在重写基类方法getCopy()的时候,其返回值使用了协变,返回的是基类返回值类型的子类型):rnpublic class TaskAttribute extends DataElementrn…rn public TaskAttribute getCopy()rn TaskAttribute temp = new TaskAttribute(index, bLevel);rn return temp;rn rn…rnrnrn在C#中如何实现这样的协变呢???使用的是.NET 3.5。rnrn我自己查了资料后写了一个尝试,虽然没有通过编译,但是还是贴出来,勿喷。rn基类:rn public delegate DataElement delegateDataElement();rn public abstract class DataElementrn rn public abstract Boolean equals(DataElement otherElement);rn public abstract int compareTo(DataElement otherElement);rn public abstract void makeCopy(DataElement otherElement);rn public abstract delegateDataElement getCopy();rn public abstract DataElement properSlot(DataElement searchItem);rn rn子类:rnpublic class TaskAttribute : DataElementrn…rn public override delegateDataElement getCopy()rn rn TaskAttribute temp = new TaskAttribute(index, bLevel);rn return temp;rn rn…rnrnrn诚心请教高手,分不多,谢谢!rn 论坛

没有更多推荐了,返回首页