这有什么不对? 我得到一个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