不兼容的类型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 = ListFoo = ArrayList因为ArrayList>不是List>子类型

更少文字修复:

 List> lists = new ArrayList<>(); 

要么

 List> lists = new ArrayList>();