不兼容的类型ListList和ArrayList的ArrayList
以下行给出了错误:
Incompatible Types. List<List> output = new ArrayList<ArrayList>();
是什么原因?
编辑
我理解如果我将第二个ArrayList更改为List,它不会给我错误。 我想知道错误的原因。 谢谢
如果你有一个List
那么你就可以为它添加一个>
LinkedList
。 但是你不能为ArrayList
执行此操作,因此后者不可能是List
。 >
从generics,inheritance和子类型
在使用generics编程时,这是一个常见的误解,但这是一个重要的学习概念。
Box
不是Box的子类型,即使Integer是Number的子类型。
正确的写作应该是: List
因为这样,您不仅可以添加> ret = new ArrayList
ArrayList
,还可以添加LinkedList
原因是generics不是协变的 。
考虑更简单的情况:
List integers = new ArrayList (); List numbers = integers; // cannot do this numbers.add(new Float(1337.44));
现在List持有Float,这当然很糟糕。
对你的情况也一样。
List> al = new ArrayList>(); List> ll = al; // cannot do this ll.add(new LinkedList ())
现在你有一个包含LinkedList
的列表ll
,但是al
被声明为ArrayList
的List。
它在Java Doc中有明确说明
通常,如果Foo是Bar的子类型(子类或子接口),并且G是一些generics类型声明, 则
G
不是G
的子类型 。 这可能是您需要了解仿制药的最难的事情,因为它违背了我们深刻的直觉。
同样的事情发生在这里它是Bar = List
和Foo = ArrayList
因为ArrayList
不是List
子类型 >
更少文字修复:
List> lists = new ArrayList<>();
要么
List> lists = new ArrayList>();