如何在增强的 for 循环中修复 ClassCastException?

How to fix ClassCastException in enhanced for-loop?

List<Object[]> listOfObjectArray = new ArrayList<Object[]>(); 
// List of object arrays, where each element is an array.

....

listOfObjectArray = ##Somerecords; (Eg : [12.0,13.0,14.0,15.0....])

...

for(Object[] obj : listOfObjectArray) {...}

这里如果列表中数组的长度是1,我得到ClassCastException。如何解决这个问题?

来自 ClassCastException

的 java 文档

Thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an instance

看到这个例子,

String[] names = {"Ethan Hawke", "Julie Delpy"}; // Array of String objects
for(Object name : names){ 
   System.out.print("Name: " + (int)name); // casting String object to int
}

投掷,

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot 
be cast to java.lang.Integer

更新:

您没有正确投射 Object[] 数据,

看到这个,

List<Object[]> listOfObjectArray = new ArrayList<Object[]>();

Object[] intArrary = { 1, 2, 3, 4 }; // declare an int array
Object[] intArrary2 = { 4, 5, 6, 7 }; // declare an int array
Object[] intArrary3 = { 5.0, 5.3, 2.0, 1.8 }; // declare a double array

listOfObjectArray.add(intArrary); // add it in Object array
listOfObjectArray.add(intArrary2); // add it in Object array
listOfObjectArray.add(intArrary3); // add it in Object array

for (Object[] outerArray : listOfObjectArray) {
    for (Object innerArray : outerArray) { // for each array "s" in array "p"

        // check if array type is Integer.
        if (innerArray instanceof Integer)
            System.out.println((int) innerArray); // cast your array to int

        // check if array type is Double.               
        if (innerArray instanceof Double)
            System.out.println((double) innerArray); // cast your array to double
    }
}

输出,

1
2
3
4
4
5
6
7
5.0
5.3
2.0
1.8

存在问题的方式给定发布的代码,如果报告的exception/line 是正确的,是什么时候"Somerecords" 并不是 真正地 创建一个 List<Object[]> 对象 - 而是一个包含 List-Object[]元素。

一个原因可能是所讨论的方法被键入为 return 一个 非泛型 List,填充了双精度值。 Java 将输入此 并带有警告 - 例如。 "uses unchecked or unsafe operations".

也就是说,C<T> generic = (C)generic_or_plain 是编译时类型有效的 - 即使生成的代码是 运行 时类型无效的 。同样,C plain = (C<T>)compatible_generic_or_plain 是有效代码,但可能导致误用 plain

考虑:

List<Object[]> r = new ArrayList<Object[]>();
List r2 = r; // Because generics are "imaginary" we can fake this,
             // but the compiler WILL GENERATE A WARNING at type information loss
r2.add(1.2); // Now we add a Double (to r since r2 is r)

// CC! - Have a Double where Object[] was expected
Object[] res = (Object[])r.get(0);

导致此问题的另一种方式,具有相同的问题,但来自不同的方面:

// Type-valid, but "unsafe" (and invalid)
List<Object[]> r = (List)Arrays.asList("Hello");

// CCE! - Have String, expected Object[]
Object[] res = (Object[])r.get(0);

解决方案:到处使用泛型,不要忽略或抑制编译器警告。

建议:在以后的帖子中包含 完整 异常消息,因为它将显示所涉及的类型 - 并且可能导致更少的 close/down 投票。