不兼容的类型 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<ArrayList<Integer>> output = new ArrayList<ArrayList<Integer>>();
有效
【参考方案1】:
如果你有一个List<List<Integer>>
,那么你就可以向它添加一个LinkedList<Integer>
。但是你不能对ArrayList<ArrayList<Integer>>
这样做,所以后者不可能是List<List<Integer>>
的类型。
【讨论】:
【参考方案2】:来自Generics, Inheritance, and Subtypes
这是在编程时常见的误解 泛型,但它是一个需要学习的重要概念。
Box<Integer>
不是 Box 的子类型,尽管 Integer 是 Number 的子类型。
【讨论】:
这不能回答问题。问题是“原因是什么?”。您所做的只是使用不同的类重述问题的前提。【参考方案3】:Java Doc中有明确说明
一般来说,如果 Foo 是 Bar 的子类型(子类或子接口),并且 G 是一些泛型类型声明,
G<Foo>
不是这种情况G<Bar>
的子类型。这可能是您需要做的最困难的事情 了解泛型,因为它违背了我们根深蒂固的观念 直觉。
同样的事情发生在这里它是 Bar = List<Integer>
和 Foo = ArrayList<Integer>
因为 ArrayList<ArrayList<Integer>>
不是 List<List<Integer>>
的子类型
【讨论】:
【参考方案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
被声明为ArrayList
s 的列表。
【讨论】:
没有突变的语言可以通过多态性获得更多乐趣。【参考方案5】:正确的写法应该是:
List<List<Integer>> ret = new ArrayList<List<Integer>>();
因为通过这种方式,您不仅可以添加ArrayList
,还可以将LinkedList
添加到ret
【讨论】:
【参考方案6】:更少的文本更多的修复:
List<List<Integer>> lists = new ArrayList<>();
或
List<List<Integer>> lists = new ArrayList<List<Integer>>();
【讨论】:
问题是“是什么原因”。以上是关于不兼容的类型 List 和 ArrayList 的 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章
不兼容的类型:“int[] 变量无法转换为 ArrayList<String>”
比较List和ArrayList的性能及ArrayList和LinkedList优缺点
import java.util.*; List<String> list=new ArrayList<String>(); 错误:类型List不带有参数