java - 这里有什么问题?我收到 java.lang.ClassCastException 错误,但我看不出哪里出了问题

标签 java arraylist queue classcastexception

这是我第一次真正使用列表和队列,所以这可能是一个非常简单的错误。是因为我的队列中充满了无法转换为整数的对象吗?

           //populate array
        for(int i=0; i<11; i++){
            numberarray[i] = i; 
        }
        // populate list with numbers from array
        List numList = Arrays.asList(numberarray);
        Collections.shuffle(numList);

        Queue queue = new LinkedList();
        queue.addAll(numList);

        int num1 = (Integer) queue.poll();
        assignPictures(button01, num1);

最佳答案

我的猜测是问题出在这里:

Arrays.asList(numberarray);

如果numberarray是一个 int[]而不是 Integer[] ,那么该调用实际上将返回一个 Listint[] s 包含该数组作为一个元素。

ClassCastException稍后当您尝试转换 int[] 时会发生反对 Integer .

由于 Java 不支持原始集合,所以没有简单的方法来使用 Arrays.asList包装原始数组 - 自动装箱不能像那样整体工作。最好开始使用 Integer[]如果你打算用它来支持 Collection .

部分混淆来自于方法 asList(T...) 需要 varargs .如果它只花了 T[]相反,作为参数,编译器不会让您传入 int[]。因为原始数组不扩展 Object[] .但是有了 varargs 支持,编译器会推断出 T作为int[]并认为你的意思是 build 一个List由单个元素支持 int[][] .

正如其他人所指出的,使用 generics真的会帮助你解决这样的歧义,使用它们编程总是一个好主意:

List<Integer> numList = Arrays.asList(numberarray);

此行给出以下编译错误,而不是让您的代码在运行时失败:

incompatible types
required: java.util.List<java.lang.Integer>
found: java.util.List<int[]>

旁注:假设您转而使用 Integer[]不要忘记这意味着元素现在可以是 null .如果是这种情况NullPointerException当您拆箱回到 int 时将被抛出- 请小心确保您的实现不允许 null元素或检查 null开箱前。

关于java - 这里有什么问题?我收到 java.lang.ClassCastException 错误,但我看不出哪里出了问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10676185/

相关文章:

java - 如何使用 Jackson 来验证重复的属性?

java - 使用java按指定顺序排列arrayList的值

java - CSS 未找到 JavaFX 规则

针对 Active Directory 的 Java 身份验证,身份验证不匹配?

java - Spring MVC : IP restriction for a single controller method

java - 如何将多个用户输入传递到 ArrayList 中?

Java GUI 与 Arraylist

c - 使用链表实现队列中的"Segmentation fault (core dumped)"

java - 寻址未知服务器 ActiveMQ 时连接停止

java - 实现一个链表栈和队列,不知道自己设置的代码是否足够高效