【问题标题】:ClassCast Exception being thrown抛出 ClassCast 异常
【发布时间】:2014-11-08 05:22:21
【问题描述】:
    int [] arr =  {1,2,4,3,6,3,2,9};
    Collection<Integer> c = new HashSet<Integer>((Collection)Arrays.asList(arr));

    for(int x : c)
    {
        System.out.print(x);
    }

上面的代码正在抛出类转换异常。有人可以帮忙吗?

【问题讨论】:

  • 哪一行准确地抛出了异常?上传你的堆栈跟踪

标签: java exception


【解决方案1】:

Arrays.asList 采用 objects 数组(Object[])。 ints 不是对象,这意味着不可能将您的 int[] 解释为 Object[] - 要做到这一点,arr 必须是 Integer[]。 (永远记住,原语和对象是根本不同的,即使编译器有时会为您方便地在它们之间进行转换。)

int[] 本身一个对象。这意味着Arrays.asList(arr) 可以使用可变参数功能转:

Arrays.asList(arr)

进入:

Arrays.asList(new int[][] { arr })

这是一个单元素数组,其唯一元素的类型为int[]——一个数组数组。

换句话说,Arrays.asList 的输入被解释为单个对象(int[] arr),然后将其包装到一个单元素对象数组中。所以结果类型是List&lt;int[]&gt;

然后您将这个List&lt;int[]&gt; 转换为Collection&lt;Integer&gt;。这意味着当您获取第一个项目(即int[])时,它会被转换为Integer。这就是导致您的 ClassCastException 的原因。

相反,您应该直接使用可变参数:

Arrays.asList(1, 2, 4, 3, 6, 3, 2, 9)

如果这样做,编译器别无选择,只能将每个元素视为一个对象。它会通过将每个自动装箱成Integer 来做到这一点。最终结果是这样的:

Arrays.asList(new Integer[]{ Integer.valueOf(1), Integer.valueOf(2), ... })

作为一般建议,检查警告的存在是有原因的。在您非常对泛型和擦除感到满意之前,我建议不要抑制它们。除非您尝试从 Collection&lt;Integer&gt; 中获取某些内容,否则 ClassCastException 不会发生,这可能比您将这些元素放入时要晚得多 - 并且可能完全放在另一个类中。

【讨论】:

    【解决方案2】:

    请不要使用raw types,请使用菱形运算符&lt;&gt;,并且不要尝试将原始数组添加到Collection 这样-

    Integer[] arr = { 1, 2, 4, 3, 6, 3, 2, 9 };
    Collection<Integer> c = new HashSet<>(Arrays.asList(arr));
    
    for (int x : c) {
        System.out.print(x);
    }
    

    问题是

    int[] arr;
    Arrays.asList(arr);
    

    返回List&lt;int[]&gt;

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2013-06-27
      • 2011-05-30
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多