这是我第一次真正使用列表和队列,所以这可能是一个非常简单的错误。是因为我的队列中充满了无法转换为整数的对象吗?
//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);
答案 0 :(得分:9)
我的猜测是问题在于:
Arrays.asList(numberarray);
如果numberarray
是int[]
而不是Integer[]
,那么该调用实际上会将包含该数组的List
个int[]
作为一个元素返回
稍后当您尝试将ClassCastException
对象转换为int[]
时会发生Integer
。
由于Java不支持原始集合,因此没有简单的方法可以使用Arrays.asList
来包装原始数组 - 自动装箱不能像一样 。如果您打算使用Integer[]
,最好先使用Collection
。
部分混淆来自方法asList(T...)
需要varargs。如果仅使用T[]
作为参数,编译器将不允许您传入int[]
,因为原始数组不会扩展Object[]
。但是在varargs的支持下,编译器会将T
推断为int[]
并认为您的意思是构建由单个元素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
元素或检查{{1}在取消装箱之前。
答案 1 :(得分:1)
你真的应该使用Generics和ArrayList / ArrayDeque,除非它真的对性能至关重要并且你使用了许多像int这样的原子类型。那你应该看看 http://labs.carrotsearch.com/hppc.html