可能重复:
How to Cast a Vector<ObjectA> to Vector<ObjectB> in Java?
IsList<Dog>
a subclass ofList<Animal>
? Why aren't Java's generics implicitly polymorphic?
我对java类型转换存在逻辑问题。
我有一个 A 类,它扩展了类 B ,因此我可以像
A a = new B();
但为什么我为Vector<A> va = new Vector<B>();
或Vector<A> va = (Vector<A>)new Vector<B>();
答案 0 :(得分:2)
java泛型不支持协方差,因此Vector<B>
执行 NOT 扩展Vector<A>
答案 1 :(得分:1)
这样想;
如果C
也延伸B
,那么您可以将C
加入Vector<B>
。
现在,如果您可以将其投放到Vector<A>
并且您执行了get
,那么您将获得C
的实例!
这没有多大意义,所以编译器不允许它。正如@amit所说,Co-variance就是这个名称。
请参阅此posting
答案 2 :(得分:0)
变量的类型必须与传递给实际对象类型的类型相匹配。
关于泛型类型的多态性,java不允许你如下:
class A { }
class B extends A { }
List<A> myList = new ArrayList<B>();
这是因为在编译时,编译器摆脱了泛型类型(通过称为类型擦除的东西)并且它曾经用于在pre java 5代码中执行。这很令人困惑,因为它与数组的行为不同。使用数组,您可以:
A[] myArr = new B[10];
但仿制药并非如此。同样,当涉及泛型时,变量的类型必须与传递给实际对象类型的类型相匹配。
希望有所帮助!