不兼容的类型 List 和 ArrayList 的 ArrayList

Posted

技术标签:

【中文标题】不兼容的类型 List 和 ArrayList 的 ArrayList【英文标题】:Incompatible types List of List and ArrayList of ArrayList 【发布时间】:2014-09-07 21:30:00 【问题描述】:

下面的行给了我错误:

Incompatible Types.

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

是什么原因?

编辑

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

【问题讨论】:

ArrayList&lt;ArrayList&lt;Integer&gt;&gt; output = new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;(); 有效 【参考方案1】:

如果你有一个List&lt;List&lt;Integer&gt;&gt;,那么你就可以向它添加一个LinkedList&lt;Integer&gt;。但是你不能对ArrayList&lt;ArrayList&lt;Integer&gt;&gt; 这样做,所以后者不可能是List&lt;List&lt;Integer&gt;&gt; 的类型。

【讨论】:

【参考方案2】:

来自Generics, Inheritance, and Subtypes

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

Box&lt;Integer&gt; 不是 Box 的子类型,尽管 Integer 是 Number 的子类型。

【讨论】:

这不能回答问题。问题是“原因是什么?”。您所做的只是使用不同的类重述问题的前提。【参考方案3】:

Java Doc中有明确说明

一般来说,如果 Foo 是 Bar 的子类型(子类或子接口),并且 G 是一些泛型类型声明,G&lt;Foo&gt; 不是这种情况 G&lt;Bar&gt; 的子类型。这可能是您需要做的最困难的事情 了解泛型,因为它违背了我们根深蒂固的观念 直觉。

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

【讨论】:

【参考方案4】:

原因是泛型不是covariant。

考虑更简单的情况:

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

现在 List 包含一个浮点数,这肯定很糟糕。

你的情况也是如此。

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

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

【讨论】:

没有突变的语言可以通过多态性获得更多乐趣。【参考方案5】:

正确的写法应该是: List&lt;List&lt;Integer&gt;&gt; ret = new ArrayList&lt;List&lt;Integer&gt;&gt;(); 因为通过这种方式,您不仅可以添加ArrayList,还可以将LinkedList添加到ret

【讨论】:

【参考方案6】:

更少的文本更多的修复:

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

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

【讨论】:

问题是“是什么原因”。

以上是关于不兼容的类型 List 和 ArrayList 的 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList<Object> 中的类型不兼容错误

不兼容的类型:“int[] 变量无法转换为 ArrayList<String>”

ArrayList和List的主要区别

比较List和ArrayList的性能及ArrayList和LinkedList优缺点

import java.util.*; List<String> list=new ArrayList<String>(); 错误:类型List不带有参数

List和ArrayList的区别