[[我不能被抛到[我的例外

时间:2015-04-09 09:03:31

标签: java scjp

任何人都可以解释此异常以及此代码中实际发生的事情:

public class Dims {

    public static void main(String[] args) {
        int[][] a = {{1, 2,}, {3, 4}};
        int[] b = (int[]) a[1];
        Object o1 = a;
        int[][] a2 = (int[][]) o1;
        int[] b2 = (int[]) o1; //Exception in thread "main" java.lang.ClassCastException: [[I cannot be cast to [I
        System.out.println(b[1]); 
    }
}

3 个答案:

答案 0 :(得分:3)

int[]int[][]不兼容,因此您无法将其转换为另一个,但您正在尝试这样做。 o1的运行时类型为int[][],您尝试将其投放到int[]

好的,为什么这些类型被称为[[I[I?您可以尝试运行int[].class.toString()int[][].class.toString来了解这一点。 int[].class将使用代码[(表示数组)I(表示整数)来表示,int[][].class将由[[表示(这意味着I(整数)的数组数组。

答案 1 :(得分:1)

异常是因为您将2d数组转换为1d

[[I代表2d数组的类

[[代表2d数组

[I代表1d数组的类

[代表1d数组

I是整数

答案 2 :(得分:1)

你不能将二维数组转换为一维数组。在这里,您[[I cannot be cast to [I得到o1 is internally pointing to 2_D integer array and b2 is 1-D array

代替那条线你可以这样做:

int[] b2 =  ((int[][])o1)[0];

这里[[I表示编译器将原始类型包装到Integer类并创建Integer类型的二维数组对象。 [I表示整数类型的一维数组。