Java 列表的不兼容类型列表和ArrayList的ArrayList

Java 列表的不兼容类型列表和ArrayList的ArrayList,java,list,arraylist,incomplete-type,Java,List,Arraylist,Incomplete Type,下面的一行给了我一个错误: Incompatible Types. List<List<Integer>> output = new ArrayList<ArrayList<Integer>>(); 不兼容的类型。 列表输出=新的ArrayList(); 原因是什么 编辑 我明白如果我将第二个ArrayList更改为List,它不会给我错误信息。不过我想知道出错的原因。谢谢如果您有一个列表,那么您就可以向其中添加一个链接列表。但是不能对Arr

下面的一行给了我一个错误:

Incompatible Types.

List<List<Integer>> output = new ArrayList<ArrayList<Integer>>();
不兼容的类型。
列表输出=新的ArrayList();
原因是什么

编辑

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

如果您有一个
列表
,那么您就可以向其中添加一个
链接列表
。但是不能对
ArrayList
执行此操作,因此后者不可能是来自的
列表的类型
这是一个常见的误解,当涉及到与编程
泛型,但这是一个需要学习的重要概念

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

这是在

通常,如果Foo是Bar的子类型(子类或子接口),并且 G是某种泛型类型声明,它不是
G
的情况
G
的子类型。这可能是你需要做的最难的事情 了解泛型,因为它违背了我们根深蒂固的观念 直觉

同样的事情发生在这里,它是
Bar=List
Foo=ArrayList
,因为
ArrayList
不是
List
的子类型,原因是泛型不是

考虑更简单的情况:

List<Integer> integers = new ArrayList<Integer>();
List<Number> numbers = integers; // cannot do this
numbers.add(new Float(1337.44));
List integers=new ArrayList();
列表编号=整数;//不能这样做
增加(新浮动(1337.44));
现在列表中有一个浮动,这肯定是不好的

你的情况也一样

List<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
List<List<Integer>> ll = al; // cannot do this
ll.add(new LinkedList<Integer>())
List al=new ArrayList();
列表ll=al;//不能这样做
ll.add(新建LinkedList())

现在您有了一个列表
ll
,它保存着
LinkedList
,但是
al
被声明为
ArrayList
s的列表。

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

更少的文本更多的修复:

List List=new ArrayList();

List List=new ArrayList();

ArrayList输出=新建ArrayList()
是不是没有变异的有效语言可以让多态性带来更多的乐趣。这并不能回答这个问题。问题是“原因是什么?”。你所做的只是用不同的类重申问题的前提,问题是“原因是什么”。