2017-08-17 90 views
-1

我需要在java中使用父类的父对象来转换类对象,并且相同的行为在C#中工作。需要在java中使用父类的父对象来转换类对象

在C#中,我可以将类对象转换为父类的父对象。

C#代码: enter image description here

在java中我不能做到这一点的行为。

Java代码: enter image description here

如何用Java实现这个.Thanks提前

+4

请不要发布图片(https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when-asking-a-question)的代码。而是直接复制粘贴到你的问题作为文本 – litelite

+0

不要张贴代码的图片,请*实际代码*请。 – DavidG

回答

1

泛型类型参数不变。这意味着Iterable<Cat>不是Iterable<Species>的子类型(反之亦然),即使CatSpecies的子类型。

C#允许一般类型声明其类型参数不变,协变,或逆变。如果声明Foo<out T>,将协变,即Foo<A>Foo<B>如果AB亚型亚型;如果你声明Foo<in T>,将逆变,即Foo<B>Foo<A>一个亚型,如果AB一个亚型。 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接口同样是有效的生产商及其类型参数,这就是为什么他们声明它是协变。

-1

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中