1

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

           //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);
4

2 回答 2

9

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

Arrays.asList(numberarray);

如果numberarray是 aint[]而不是 a Integer[],则该调用实际上将返回 a Listof int[]s ,其中包含该数组作为一个元素。

ClassCastException您尝试将int[]对象强制转换为Integer.

由于 Java 不支持原始集合,因此没有简单的方法可以Arrays.asList用来包装原始数组 - 自动装箱不能像那样大量工作。Integer[]如果你打算用它来支持一个Collection.

部分混淆来自该方法asList(T...)采用varargs的事实。如果它只是将 aT[]作为参数,编译器不会让你传入 aint[]因为原始数组不扩展Object[]。但是通过 varargs 支持,编译器推断Tint[]并认为您的意思是构建一个List由 single-element 支持的int[][]

正如其他人所指出的,使用泛型确实可以帮助您解决这样的歧义,使用它们进行编程总是一个好主意:

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

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

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

旁注:假设您开始使用 anInteger[]不要忘记这意味着元素现在可以是null. 如果是这种情况,NullPointerException当您取消装箱时会抛出a int- 请注意确保您的实现不允许null元素,否则null在取消装箱之前进行检查。

于 2012-05-20T18:54:26.930 回答
1

你真的应该使用泛型和 ArrayList/ArrayDeque,除非它对性能非常关键,并且你使用了很多原子类型,比如 int。然后你应该看看 http://labs.carrotsearch.com/hppc.html

于 2012-05-20T18:57:44.310 回答