泛型不兼容的类型

时间:2014-09-05 13:47:33

标签: java

偶然发现不兼容的类型错误原因,我不明白。

为什么这段代码错了?

List<List<String>> a = new ArrayList<>();
List b = a; // is ok
List<List> c = a; // incompatible types

4 个答案:

答案 0 :(得分:7)

描述here。 超类型兼容性仅适用于“外部”级别,但不适用于类型参数之间的“内部”。它不直观,但它是如何工作的...... 此外,List是一种原始类型,其行为与List<Object>略有不同 - 后者描述为here

答案 1 :(得分:3)

List<List> 

隐含

List<List<Object>>

不是

的父母
List<List<String>>

在第一种情况下成功的原因是因为类型推断。 编译器将基本上检查表达式需要哪种类型才有意义,它将生成

List<List<String>> a = b;

在第二种情况下,它将默认为

List<List<Object>> a = b // which does not compile

答案 2 :(得分:3)

写作

List b = a;

不涉及泛型。它定义了一个名为b的原始List类型,它可以将任何对象作为它的元素。

不要将其与

进行比较
List<List> c = a;

因为它涉及泛型,这就是为什么编译器会在这里强制执行类型兼容性检查。

答案 3 :(得分:2)

简短回答:因为您的c列表包含包含所有类型对象的列表 例如,您还可以添加Integer个对象 a列表只能包含String个对象。