java - 抛出 ClassCast 异常

标签 java exception

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

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

最佳答案

Arrays.asList接受一个对象数组(Object[])。 int s 不是对象,这意味着无法解释您的 int[]作为Object[] -- 为此,arr必须是Integer[] 。 (永远记住,基元和对象是根本不同的,即使编译器有时会方便地在它们之间进行转换。)

但是int[]本身一个对象。这意味着Arrays.asList(arr)可以使用 varargs 功能来转动:

Arrays.asList(arr)

进入:

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

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

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

然后你拿这个List<int[]>并尝试将其转换为 Collection<Integer> 。这意味着当您获取第一个项目(即 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<Integer> 中获取某些内容,否则 ClassCastException 不会发生。 ,这可能比您将这些元素放入 - 甚至可能完全放入另一个类中晚得多。

关于java - 抛出 ClassCast 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26814064/

相关文章:

java - 数据结构的工作方式类似于 Map,但允许随机更改键顺序

java - 如何修复 JTextField 上的按键监听器?

bst实现中的Java参数传递

Frame.add(Object) 处的 java.lang.NullPointerException

java - 执行捕获优先级

java - Spring + hibernate : manually commit the transaction at end

java - 使用用户输入迭代并填充 LinkedHashMap,避免重复,无需 try-catch 和搜索键

c# - 如何连接两个异常?

c++ - 组织和编写异常类的正确方法

android - 记录后重新抛出 UncaughtExceptionHandler 异常