初始化ArrayList<ArrayList<Integer>>。

8

我遇到了以下问题:

当我初始化一个 ArrayList<ArrayList<Integer>> 时,代码如下:

ArrayList<ArrayList<Integer>> group = new ArrayList<ArrayList<Integer>>();
group.add((ArrayList<Integer>) Arrays.asList(1, 2, 3));
group.add((ArrayList<Integer>) Arrays.asList(4, 5, 6));
group.add((ArrayList<Integer>) Arrays.asList(7, 8, 9));
for (ArrayList<Integer> list : group) {
    for (Integer i : list) {
        System.out.print(i+" ");
    }
    System.out.println();
}

尽管代码可以成功编译,但我仍然在控制台上收到异常消息:
线程中的异常 "main" java.lang.ClassCastException: java.util.Arrays$ArrayList 无法转换为 java.util.ArrayList at Solution.main(Solution.java:49)
谢谢帮助!

这让我觉得应该在编译时捕获。强制转换是怎么回事? - Blindy
4个回答

12

Arrays.asList 不会返回一个 java.util.ArrayList。它确实返回一个名为 ArrayList 的类的实例,巧合的是 - 但那不是 java.util.ArrayList

除非你真的需要这个东西来作为一个 ArrayList<ArrayList<Integer>>,否则我只需将其更改为:

List<List<Integer>> group = new ArrayList<>();
group.add(Arrays.asList(1, 2, 3));
group.add(Arrays.asList(4, 5, 6));
group.add(Arrays.asList(7, 8, 9));
for (List<Integer> list : group) {
    ...
}
如果您确实需要一个 ArrayList<ArrayList<...>> 或者如果您需要能够添加到“内部”列表,即使您不需要它们的静态类型为 ArrayList,那么您需要为每个列表创建一个新的 ArrayList
group.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
// etc

1
@manouti:糟糕!我专门复制那一行来做这件事……完成了。 - Jon Skeet

5
Arrays.asList的返回值不是java.util.ArrayList,而是一个独立的类java.util.Arrays$ArrayList,即使它是一个List
如果你必须使用ArrayList,那么可以使用从Arrays.asList返回的List来创建另一个ArrayList,而不是进行强制类型转换,例如:
group.add(new ArrayList<Integer>( Arrays.asList(1, 2, 3) ));

4

Arrays.asList 返回的是一个嵌套静态类型 java.util.Arrays.ArrayList 的实例,与 java.util.ArrayList 不同。你可以通过编程到 List 接口(java.util.Arrays.ArrayList 也实现了该接口)并避免不必要的转换来避免这个问题:

List<List<Integer>> group = new ArrayList<List<Integer>>();
group.add(Arrays.asList(1, 2, 3));
group.add(Arrays.asList(4, 5, 6));
group.add(Arrays.asList(7, 8, 9));
for (List<Integer> list : group) {
    for (Integer i : list) {
        System.out.print(i+" ");
    }
    System.out.println();
}

1
group.add(new ArrayList<Integer>((Arrays.asList(1, 2, 3))));
group.add(new ArrayList<Integer>((Arrays.asList(4, 5, 6))));
group.add(new ArrayList<Integer>((Arrays.asList(7, 8, 9))));

for (ArrayList<Integer> arrayList : group) {
  for (Integer integer : arrayList) {
    System.out.println(integer);
  }
}

请参考这段代码。它可能有助于您实现您的需求。

1
你的回答与已经被接受的回答有什么真正的区别? - yakobom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接