【问题标题】:Assigning ArrayList<List<Integer>> with an ArrayList<ArrayList<Integer>> [duplicate]用 ArrayList<ArrayList<Integer>> 分配 ArrayList<List<Integer>> [重复]
【发布时间】:2017-10-24 23:23:04
【问题描述】:
为什么我不能将ArrayList<ArrayList<Integer>> 分配给ArrayList<List<Integer>>,如下所示:
ArrayList<List<Integer>> x = new ArrayList<ArrayList<Integer>>();
不是所有的 ArrayLists 都是列表,因此我可以在哪里放置一个列表,我也可以放置一个 ArrayList?
【问题讨论】:
标签:
java
generics
arraylist
【解决方案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。
如果x的类型是,你可以将y分配给x
ArrayList<? extends List<Integer>>`
因为您无法在该列表中添加任何内容(除了文字 null),因此不会出现 ClassCastException。
【解决方案2】:
因为如果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。