为什么我不能将ArrayList<ArrayList<Integer>>
分配到ArrayList<List<Integer>>
,如下所示:
ArrayList<List<Integer>> x = new ArrayList<ArrayList<Integer>>();
Aren所有的ArrayLists列表,因此我可以放置List,我还可以放置一个ArrayList?
答案 0 :(得分:1)
如果这是合法的,您可以执行以下操作:
ArrayList<ArrayList<Integer>> y = new ArrayList<>();
ArrayList<List<Integer>> x = y; // Compiler error! Pretend it's OK, though.
x.add(new LinkedList<>()); // Fine, because a LinkedList<Integer> is a List<Integer>
然后这会失败:
ArrayList<Integer> a = y.get(0); // ClassCastException!
因为y
的第一个元素是LinkedList
,而不是ArrayList
。
如果y
的类型为
x
分配给x
ArrayList<? extends List<Integer>>`
因为您无法在该列表中添加任何内容(文字null
除外),因此ClassCastException
不会发生。
答案 1 :(得分:0)
因为如果x
被输入为ArrayList<List<Integer>>
,那么您可以将任何类型的列表填入x
,因此这应该是合法的:
x.add(new LinkedList<Integer>());
但如果x
实际上是ArrayList<ArrayList<Integer>>
,则不应允许这样做。
这是允许的:
ArrayList<? extends List<Integer>> x = new ArrayList<ArrayList<Integer>>();
但是根据x
的定义,您将无法将任何内容放入x
。