这里有什么问题吗?我收到 java.lang.ClassCastException 错误,但我看不出哪里出了问题

2023-12-06

这是我第一次真正使用列表和队列,所以这可能是一个非常简单的错误。是因为我的队列充满了无法转换为整数的对象吗?

           //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);

我的猜测是问题出在这里:

Arrays.asList(numberarray);

If numberarray is an int[]而不是一个Integer[],那么该调用实际上会返回一个List of int[]s 包含该数组作为一个元素。

The ClassCastException稍后当您尝试投射时会发生int[]反对Integer.

由于 Java 不支持原始集合,因此没有简单的方法可以使用Arrays.asList包装原始数组 - 自动装箱不起作用en masse像那样。最好开始使用Integer[]如果您打算用它来支持Collection.

部分混乱来自于该方法asList(T...) takes varargs。如果只需要一个T[]作为参数,编译器不会让你传入一个int[]因为原始数组不扩展Object[]。但是有了 varargs 支持,编译器就会推断T as 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元素或者检查null拆箱之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这里有什么问题吗?我收到 java.lang.ClassCastException 错误,但我看不出哪里出了问题 的相关文章

随机推荐