Java 正在引发类强制转换异常 int[]arr={1,2,4,3,6,3,2,9}; Collection c=新的HashSet((Collection)Arrays.asList(arr)); 用于(整数x:c) { 系统输出打印(x); }

Java 正在引发类强制转换异常 int[]arr={1,2,4,3,6,3,2,9}; Collection c=新的HashSet((Collection)Arrays.asList(arr)); 用于(整数x:c) { 系统输出打印(x); },java,exception,Java,Exception,上面的代码正在引发classcast异常。有人能帮忙吗?请不要使用,一定要使用菱形运算符,不要像那样尝试向集合添加基元数组- 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异常。有人能帮忙吗?

请不要使用,一定要使用菱形运算符
,不要像那样尝试向
集合添加基元数组-

    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);
    }
返回一个
列表

请不要使用,一定要使用菱形运算符
,不要像这样尝试向
集合
添加基元数组-

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

返回一个
列表
数组。asList
获取一个对象数组(一个
对象[]
int
s不是对象,这意味着不可能将
int[]
解释为
对象[]
——为此,
arr
必须是
Integer[]
。(请始终记住,基本体和对象是根本不同的,即使编译器有时会方便地为您在它们之间进行转换。)

但是
int[]
本身就是一个对象。这意味着
Arrays.asList(arr)
可以使用varargs功能来打开:

int[] arr;
Arrays.asList(arr);
进入:

这是一个单元素数组,其唯一元素的类型为
int[]
——一个数组数组

换句话说,
Arrays.asList
的输入被解释为单个对象(
int[]arr
),然后被包装成一个单元素的对象数组。因此,结果类型是
List

然后,将此
列表
转换为
集合
。这意味着当您获取第一个项目(即
int[]
)时,它将转换为
整数。这就是导致你的ClassCastException的原因

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

Arrays.asList(new int[][] { arr })
如果这样做,编译器就别无选择,只能将每个元素视为一个对象。它将通过自动将每一个装箱成一个
整数来实现这一点。最终的结果是这样的:

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

作为一条一般性建议,选中的警告是有原因的。在您对泛型和擦除非常熟悉之前,我建议您不要抑制它们。ClassCastException在您尝试从
集合中提取某些内容之前不会发生,这可能要比您将这些元素放入另一个类时发生得晚得多,也可能发生在另一个类中。

数组。asList
获取一个对象数组(一个
对象[]
int
s不是对象,这意味着不可能将
int[]
解释为
对象[]
——为此,
arr
必须是
Integer[]
。(请始终记住,基本体和对象是根本不同的,即使编译器有时会方便地为您在它们之间进行转换。)

但是
int[]
本身就是一个对象。这意味着
Arrays.asList(arr)
可以使用varargs功能来打开:

int[] arr;
Arrays.asList(arr);
进入:

这是一个单元素数组,其唯一元素的类型为
int[]
——一个数组数组

换句话说,
Arrays.asList
的输入被解释为单个对象(
int[]arr
),然后被包装成一个单元素的对象数组。因此,结果类型是
List

然后,将此
列表
转换为
集合
。这意味着当您获取第一个项目(即
int[]
)时,它将转换为
整数。这就是导致你的ClassCastException的原因

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

Arrays.asList(new int[][] { arr })
如果这样做,编译器就别无选择,只能将每个元素视为一个对象。它将通过自动将每一个装箱成一个
整数来实现这一点。最终的结果是这样的:

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

作为一条一般性建议,选中的警告是有原因的。在您对泛型和擦除非常熟悉之前,我建议您不要抑制它们。ClassCastException不会发生,直到您尝试从
集合
中提取某些内容时才会发生,这可能比您将这些元素放入另一个类时发生的要晚得多,也可能发生在另一个类中。

哪一行会引发异常?上载堆栈跟踪哪一行会引发异常?上载堆栈跟踪