【问题标题】:Initialize ArrayList<ArrayList<Integer>>初始化 ArrayList<ArrayList<Integer>>
【发布时间】:2014-11-24 19:49:45
【问题描述】:

我遇到了如下问题:

当我初始化一个ArrayList&lt;ArrayList&lt;Integer&gt;&gt;时,代码是:

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 在 Solution.main(Solution.java:49)

感谢您的帮助!

【问题讨论】:

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

标签: java arrays arraylist


【解决方案1】:

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

除非您需要这真的是ArrayList&lt;ArrayList&lt;Integer&gt;&gt;,否则我会将其更改为:

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&lt;ArrayList&lt;...&gt;&gt; - 或者如果您需要能够添加到“内部”列表中,即使您不需要它们的静态类型为ArrayList - 然后你需要为每个列表创建一个新的ArrayList

group.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
// etc

【讨论】:

  • @manouti:Doh!我专门复制了那行来做到这一点......完成。
【解决方案2】:

Arrays.asList 的返回不是java.util.ArrayListjava.util.Arrays$ArrayList 是一个单独的类,嵌套在 Arrays 中,即使它是 List

如果您必须有一个ArrayList,则使用从Arrays.asList 返回的List 自己创建另一个ArrayList,而不是强制转换,例如:

group.add(new ArrayList<Integer>( Arrays.asList(1, 2, 3) ));

【讨论】:

    【解决方案3】:

    Arrays.asList 返回与java.util.ArrayList 不同的嵌套静态类型java.util.Arrays.ArrayList 的实例。您可以通过对List 接口(@98​​7654325@ 也实现了该接口)进行编程来避免此问题,并且无需进行不必要的强制转换:

    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();
    }
    

    【讨论】:

      【解决方案4】:
      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);
        }
      }
      

      请参考此代码。这可能会帮助您实现您的要求。

      【讨论】:

      • 您的答案与已经接受的答案有何不同?
      猜你喜欢
      • 2023-01-10
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多