分配ArrayList <list <integer>&gt;使用ArrayList <arraylist <integer>&gt;

时间:2017-10-24 23:23:05

标签: java generics arraylist

为什么我不能将ArrayList<ArrayList<Integer>>分配到ArrayList<List<Integer>>,如下所示:

ArrayList<List<Integer>> x = new ArrayList<ArrayList<Integer>>();

Aren所有的ArrayLists列表,因此我可以放置List,我还可以放置一个ArrayList?

2 个答案:

答案 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