可能的重复:
如何投射矢量<对象A>到Vector<对象B>在Java中List<Dog>
是List<Animal>
的一个子类吗?为什么';t Java';s泛型隐含多态性?
我对java类型转换有一个逻辑问题。我有一个类a,它扩展了类B。因此,我可以有这样的语句A a = new B();
但是为什么Vector<A> va = new Vector<B>();
或Vector<A> va = (Vector<A>)new Vector<B>();
出现编译器错误
java泛型不支持协变,因此Vector<B>
不扩展Vector<A>
这样想吧;
如果C
也扩展了B
,那么您可以将C
放入Vector<B>
中。
现在,如果您可以将其强制转换为Vector<A>
并执行get
,那么您将获得C
的实例!
这没有多大意义,所以编译器不允许这样做。正如@amit所说,协变就是这个名字。
请参阅此张贴
当涉及到泛型类型的多态性时,java不允许您执行以下操作:
class A { }
class B extends A { }
List<A> myList = new ArrayList<B>();
这是因为在编译时,编译器摆脱了泛型类型(通过一种称为类型擦除的方法),并像在java 5之前的代码中那样。这是令人困惑的,因为它与数组的行为不同。有了阵列,你可以做到:
A[] myArr = new B[10];
但泛型的情况并非如此。同样,当涉及到泛型时,变量的类型必须与传递给实际对象类型的类型相匹配。
希望能有所帮助!