以下行给出了错误:
Incompatible Types.
List<List<Integer>> output = new ArrayList<ArrayList<Integer>>();
是什么原因?
修改
我理解如果我将第二个ArrayList更改为List,它不会给我错误。我想知道错误的原因。感谢
答案 0 :(得分:24)
在编程方面,这是一个常见的误解 泛型,但它是一个重要的学习概念。
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)
通常,如果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>>();