Java类型转换问题

时间:2011-05-26 21:19:02

标签: java generics covariance

  

可能重复:
  How to Cast a Vector<ObjectA> to Vector<ObjectB> in Java?
  Is List&lt;Dog&gt; a subclass of List&lt;Animal&gt;? 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>();

收到编译器错误

3 个答案:

答案 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];

但仿制药并非如此。同样,当涉及泛型时,变量的类型必须与传递给实际对象类型的类型相匹配。

希望有所帮助!