为什么不能将一个泛型类型实例的引用分配给另一个泛型类型实例?

时间:2014-05-12 07:57:43

标签: java

为什么我收到此警告消息,无法将数字转换为整数。

List<Number> list1 = null;
List<Integer> list2 = null;
list2 = list1;// warning Type mismatch: cannot convert from List<Number> to List<Integer>.

3 个答案:

答案 0 :(得分:5)

List<Integer>不是List<Number>的子类型。

请注意:Oracle doc

enter image description here

答案 1 :(得分:2)

Java泛型是不变的。

List<String>不能分配给List<Object>类型的引用。与您从StringObject甚至从String[]Object[]的正常参考分配所期望的不同(使数组“协变”是一个错误)。相反,使用上限,如下所示:

List<? extends Number> numbers = null;
List<Integer> integers = null;
numbers = integers; // <-- Okay!

答案 2 :(得分:1)

泛型有点奇怪

List<SuperType>

实际上不是

的超类型
List<SubType>

e.g。 List<Number>不是List<Integer>的超类型。 (即Java的泛型是不变的,而不是像Java的数组那样的协变)。这是因为如果这种关系持有你可以用List<Number>代替List<Integer>,那么如果你不进行替换就会允许那些非法的操作。

更具体地说,如果Java的泛型像数组一样是协变的,你可以这样做:

List<Number> list = new ArrayList<Integer>();

然后你可以输入一个Double into列表,因为对于编译器,list是一个ArrayList!正如您所看到的,这打破了泛型应该提供的保证(即,您应该只能将Integer个对象放入list),因此不允许这样做。

因此,您无法将List<Number>分配给List<Integer>。事实上,即使仿制品在没有铸造的情况下是协变的,我也不认为你能做到这一点......