Arrays.asList 采用 objects 数组(Object[])。 ints 不是对象,这意味着不可能将您的 int[] 解释为 Object[] - 要做到这一点,arr 必须是 Integer[]。 (永远记住,原语和对象是根本不同的,即使编译器有时会为您方便地在它们之间进行转换。)
但int[] 本身是一个对象。这意味着Arrays.asList(arr) 可以使用可变参数功能转:
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 不会发生,这可能比您将这些元素放入时要晚得多 - 并且可能完全放在另一个类中。