我需要在java中使用父类的父对象来转换类对象,并且相同的行为在C#中工作。需要在java中使用父类的父对象来转换类对象
在C#中,我可以将类对象转换为父类的父对象。
在java中我不能做到这一点的行为。
如何用Java实现这个.Thanks提前
我需要在java中使用父类的父对象来转换类对象,并且相同的行为在C#中工作。需要在java中使用父类的父对象来转换类对象
在C#中,我可以将类对象转换为父类的父对象。
在java中我不能做到这一点的行为。
如何用Java实现这个.Thanks提前
泛型类型参数不变。这意味着Iterable<Cat>
不是Iterable<Species>
的子类型(反之亦然),即使Cat
是Species
的子类型。
C#允许一般类型声明其类型参数不变,协变,或逆变。如果声明Foo<out T>
,将协变,即Foo<A>
是Foo<B>
如果A
是B
亚型亚型;如果你声明Foo<in T>
,将逆变,即Foo<B>
是Foo<A>
一个亚型,如果A
是B
一个亚型。 IEnumerable
声明与它的类型参数是协变(即,具有<out T>
,所以IEnumerable<Cat>
可以是IEnumerable<Species>
的子类型。
协方差和逆变在使用Java通配符实现。? extends
通配符是协变,而? super
通配符逆变。有在PECS规则(生产者extends
,消费者super
),可指导您在使用它们。该Iterable
接口是有效的类型参数T
的生产商(它有它返回一个Iterator<T>
,这反过来又返回一个方法的方法T
;并且没有采用0123的方法作为论点的);因此,它应该始终与通配符? extends
一起使用。所以你应该使用Iterable<? extends Something>
而不是Iterable<Something>
。
所以,如果你声明Animal
这样的:
abstract class Animal extends Species {
public Iterable<? extends Cat> elements();
}
然后你可以使用它像这样:
Iterable<? extends Species> childNodes;
childNodes = (currentElement != null) ? currentElement.elements() : null;
顺便说一句,在C#中IEnumerable
接口同样是有效的生产商及其类型参数,这就是为什么他们声明它是协变。
Java和C#是不同的,让我的代码说明你:
package test;
class A {
{
System.out.println(1);
}
}
class B extends A {
{
System.out.println(2);
}
}
class C extends B {
{
System.out.println(3);
}
}
public class MainClass {
public static void main(String[] args) {
A c = new C();
}
}
这里我们可以创建父类的对象,并用该子类实例化或初始化该对象,但反过来并不正确。即,C c = new A();
该行将抛出java.lang.ClassCastException。
这是因为在Java中的子类可以使用父类的方法,但父类不能使用子类的方法一般,但也有一些技巧可以达到这个目的。
一般可以使用有父母,但父母的东西都不允许用孩子的东西,你可以认为它像。在Java中
请不要发布图片(https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when-asking-a-question)的代码。而是直接复制粘贴到你的问题作为文本 – litelite
不要张贴代码的图片,请*实际代码*请。 – DavidG