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);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码抛出了一个classcast异常.有人可以帮忙吗?
Arrays.asList获取一个对象数组(一Object[]).ints不是对象,这意味着你不可能将你int[]理解为Object[]- 做到这一点,arr就必须这样做Integer[].(永远记住原语和对象根本不同,即使编译器有时会方便地为它们进行转换.)
但int[]它本身就是一个对象.这意味着Arrays.asList(arr)可以使用varargs功能转:
Arrays.asList(arr)
Run Code Online (Sandbox Code Playgroud)
成:
Arrays.asList(new int[][] { arr })
Run Code Online (Sandbox Code Playgroud)
这是一个单元素数组,其唯一元素是类型int[]- 数组数组.
换句话说,输入to Arrays.asList被解释为单个对象(the int[] arr),然后将其包装到一个元素的对象数组中.所以结果类型是List<int[]>.
然后你拿这个List<int[]>并试着把它投到一个Collection<Integer>.这意味着当你获取第一个项目(它是一个int[])时,它会被转换为Integer.这就是造成ClassCastException的原因.
相反,您应该直接使用varargs:
Arrays.asList(1, 2, 4, 3, 6, 3, 2, 9)
Run Code Online (Sandbox Code Playgroud)
如果这样做,编译器别无选择,只能将每个元素视为对象.它会通过将每个人自动装入一个来实现Integer.最终结果是这样的:
Arrays.asList(new Integer[]{ Integer.valueOf(1), Integer.valueOf(2), ... })
Run Code Online (Sandbox Code Playgroud)
作为一般建议,检查警告是有原因的.在你对泛型和擦除变得非常熟悉之前,我建议不要压制它们.ClassCastException不会发生,直到你尝试从中取出一些东西Collection<Integer>,这可能比你把这些元素放入 - 并且可能在另一个类中完全发生得晚得多.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |