不兼容的类型ListList和ArrayList的ArrayList

Kra*_*ken 23 java list arraylist incomplete-type

以下行给出了错误:

Incompatible Types.

List<List<Integer>> output = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)

是什么原因?

编辑

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

Ank*_*mba 27

泛型,继承和子类型

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

在此输入图像描述

Box<Integer> 尽管Integer是Number的子类型,但它不是Box的子类型.

  • 这并不能回答问题。问题是“原因是什么?”。您所做的只是使用不同的类重申问题的前提。 (3认同)

Bin*_*eng 18

正确的书写应该是: List<List<Integer>> ret = new ArrayList<List<Integer>>(); 既然这样,你不仅增加ArrayList,而且LinkedListret


Daw*_*ica 17

如果你有一个,List<List<Integer>>那么你就可以添加一个LinkedList<Integer>.但你不能这样做ArrayList<ArrayList<Integer>>,所以后者不可能是一种类型List<List<Integer>>.


lpi*_*ora 8

原因是泛型不是协变的.

考虑更简单的情况:

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

现在List持有一个Float,这当然很糟糕.

对你的情况也一样.

List<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
List<List<Integer>> ll = al; // cannot do this
ll.add(new LinkedList<Integer>())
Run Code Online (Sandbox Code Playgroud)

现在你有一个ll包含的列表LinkedList,但是它al被声明为ArrayLists 的列表.

  • 多态性使无突变的语言变得更加有趣。 (2认同)

Pav*_*nik 6

更少的文字更多的修复:

List<List<Integer>> lists = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

或者

List<List<Integer>> lists = new ArrayList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)


Cod*_*roc 5

它在Java Doc中有明确说明

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

同样的事情发生在这里的Bar = List<Integer>,并Foo = ArrayList<Integer>ArrayList<ArrayList<Integer>>未分型List<List<Integer>>