这有什么不对?我得到一个java.lang.ClassCastException错误,但我看不出我出错的地方

时间:2012-05-20 18:49:40

标签: java arraylist queue 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);

2 个答案:

答案 0 :(得分:9)

我的猜测是问题在于:

Arrays.asList(numberarray);

如果numberarrayint[]而不是Integer[],那么该调用实际上会将包含该数组的Listint[]作为一个元素返回

稍后当您尝试将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