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/