这有什么不对? 我得到一个java.lang.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);
你真的应该使用Generics和ArrayList / ArrayDeque,除非它真的对性能至关重要并且你使用了许多像int这样的primefaces类型。 然后你应该看看http://labs.carrotsearch.com/hppc.html
我的猜测是问题在这里:
Arrays.asList(numberarray);
如果numberarray
是一个int[]
而不是一个Integer[]
,那么该调用实际上会返回一个包含该数组的int[]
的List
作为一个元素。
当您尝试将int[]
对象Integer
转换为Integer
时, ClassCastException
会发生。
由于Java不支持原始集合,因此没有简单的方法可以使用Arrays.asList
来包装原始数组 – 自动装箱并不像这样Arrays.asList
。 如果您打算使用Integer[]
来支持Collection
最好先使用Integer[]
。
部分混淆来自asList(T...)
采用varargs的事实。 如果只是将T[]
作为参数,则编译器不允许传入int[]
因为原始数组不会扩展Object[]
。 但是在varargs的支持下,编译器将T
推断为int[]
并认为你的意思是构建一个由单元素int[][]
支持的List
。
正如其他人所指出的那样,使用generics将真正帮助你解决这种模糊问题,使用它们进行编程总是一个好主意:
List numList = Arrays.asList(numberarray);
此行给出以下编译错误,而不是允许您的代码在运行时失败:
incompatible types
required: java.util.List
found: java.util.List
旁注:假设您转向使用Integer[]
请不要忘记这意味着元素现在可以为null
。 如果是这种情况,当你取消装回到int
时会抛出NullPointerException
– 只是要小心确保你的实现不允许null
元素或者在取消装箱之前检查null
。