偶然发现不兼容的类型错误原因,我不明白。
为什么这段代码错了?
List<List<String>> a = new ArrayList<>();
List b = a; // is ok
List<List> c = a; // incompatible types
答案 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
个对象。