繁体   English   中英

引发ClassCast异常

[英]ClassCast Exception being thrown

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

上面的代码抛出classcast异常。 谁能帮忙吗?

Arrays.asList采用对象数组( Object[] )。 int不是对象,这意味着不可能将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的原因。

相反,您应该直接使用varargs:

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

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

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

作为一般建议,检查警告是有原因的。 除非您对泛型和擦除非常满意,否则我建议您不要压制它们。 除非您尝试从Collection<Integer>获取某些内容,否则不会发生ClassCastException,这可能比将这些元素放入(甚至可能一起)放入另一个类时要晚得多。

请不要使用原始类型 ,不要使用菱形运算符<> ,也不要尝试将原始数组添加到这样的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<int[]>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM