不兼容的类型ListList和ArrayList的ArrayList

时间:2014-07-17 06:26:03

标签: java list arraylist incomplete-type

以下行给出了错误:

Incompatible Types.

List<List<Integer>> output = new ArrayList<ArrayList<Integer>>();

是什么原因?

修改

我理解如果我将第二个ArrayList更改为List,它不会给我错误。我想知道错误的原因。感谢

6 个答案:

答案 0 :(得分:24)

来自Generics, Inheritance, and Subtypes

  

在编程方面,这是一个常见的误解   泛型,但它是一个重要的学习概念。

     

enter image description here

     

Box<Integer>不是Box的子类型,即使Integer是Number的子类型。

答案 1 :(得分:16)

如果您有List<List<Integer>>,那么您可以为其添加LinkedList<Integer>。但是你不能为ArrayList<ArrayList<Integer>>执行此操作,因此后者不一定是List<List<Integer>>的类型。

答案 2 :(得分:14)

正确的写作应该是: List<List<Integer>> ret = new ArrayList<List<Integer>>(); 由于这样,您不仅可以ArrayList,还可以LinkedList添加ret

答案 3 :(得分:8)

原因是泛型不是covariant

考虑更简单的情况:

List<Integer> integers = new ArrayList<Integer>();
List<Number> numbers = integers; // cannot do this
numbers.add(new Float(1337.44));

Now List拥有一个Float,这当然很糟糕。

与您的情况相同。

List<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
List<List<Integer>> ll = al; // cannot do this
ll.add(new LinkedList<Integer>())

现在您有一个包含ll的列表LinkedList,但al被声明为ArrayList的列表。

答案 4 :(得分:5)

Java Doc

中明确说明了这一点
  

通常,如果Foo是Bar的子类型(子类或子接口),和   G是一些泛型类型声明,不是G<Foo>的情况   子类型G<Bar> 。这可能是您需要的最难的事情   了解仿制药,因为它违背了我们的理解   直觉。

同样的事情发生在这里它是Bar = List<Integer>Foo = ArrayList<Integer>因为ArrayList<ArrayList<Integer>>不是List<List<Integer>>的子类型

答案 5 :(得分:0)

少输入更多文字修正

List<List<Integer>> lists = new ArrayList<>();

List<List<Integer>> lists = new ArrayList<List<Integer>>();