[英]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.