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)
我的猜测是问题在这里:
Arrays.asList(numberarray);
Run Code Online (Sandbox Code Playgroud)
如果numberarray是一个int[]而不是一个Integer[],那么该调用实际上会返回包含该数组作为一个元素List的int[]s.
ClassCastException当你试图将int[]对象强制转换为时,会发生这种情况Integer.
由于Java不支持原始集合存在使用没有简单的方法Arrays.asList来包装一个基本数组-自动装箱不起作用集体这样.Integer[]如果您计划使用它来支持,最好开始使用Collection.
部分混乱来自于该方法asList(T...)采用varargs的事实.如果它只是T[]作为一个参数,编译器不会让你传入,int[]因为原始数组不会扩展Object[].但随着可变参数的支持,编译器推断T为int[],认为你的意思是建立一个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在取消装箱之前检查.