这有什么不对?我得到一个java.lang.ClassCastException错误,但我看不出我出错的地方

Con*_*ton 1 java queue arraylist 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);
Run Code Online (Sandbox Code Playgroud)

Pau*_*ora 9

我的猜测是问题在这里:

Arrays.asList(numberarray);
Run Code Online (Sandbox Code Playgroud)

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

ClassCastException当你试图将int[]对象强制转换为时,会发生这种情况Integer.

由于Java不支持原始集合存在使用没有简单的方法Arrays.asList来包装一个基本数组-自动装箱不起作用集体这样.Integer[]如果您计划使用它来支持,最好开始使用Collection.

部分混乱来自于该方法asList(T...)采用varargs的事实.如果它只是T[]作为一个参数,编译器不会让你传入,int[]因为原始数组不会扩展Object[].但随着可变参数的支持,编译器推断Tint[],认为你的意思是建立一个List由单一元素的支持int[][].

正如其他人已经注意到的那样,使用泛型将真正帮助你解决这样的模糊问题,使用它们进行编程总是一个好主意:

List<Integer> numList = Arrays.asList(numberarray);
Run Code Online (Sandbox Code Playgroud)

此行提供以下编译错误,而不是允许您的代码在运行时失败:

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

旁注:假设你转向使用,Integer[]不要忘记这意味着元素现在可以null.如果是这种情况,NullPointerException当你取消装箱时会抛出int- 只是要小心确保你的实现不允许null元素或者null在取消装箱之前检查.