Q****r 发帖数: 7340 | 1 int [][] a ={{1,2}, {2,3}};
Object o = a;
int b = (int []) o;
编译能通过,但是有ClassCastException在第三句
不能理解,为什么能够编译通过?
如果是
int [][] a ={{1,2}, {2,3}};
Object o = a;
int b = (int []) a;
编译就不能通过了,在第三句。这个很容易理解。 | F****n 发帖数: 3271 | 2
~~~~~~~~~~~~~~~~~~~~~~~~~~
Are you sure it's not int[] b = (int[])o;
【在 Q****r 的大作中提到】 : int [][] a ={{1,2}, {2,3}}; : Object o = a; : int b = (int []) o; : 编译能通过,但是有ClassCastException在第三句 : 不能理解,为什么能够编译通过? : 如果是 : int [][] a ={{1,2}, {2,3}}; : Object o = a; : int b = (int []) a; : 编译就不能通过了,在第三句。这个很容易理解。
| Q****r 发帖数: 7340 | 3 谢谢,提醒,已经改了
【在 F****n 的大作中提到】 : : ~~~~~~~~~~~~~~~~~~~~~~~~~~ : Are you sure it's not int[] b = (int[])o;
| F****n 发帖数: 3271 | 4 Then it's obvious, an object can be a primitive array,
but an "array of primitive array" (which is actually an object array) can
never be a primitive array.
【在 Q****r 的大作中提到】 : 谢谢,提醒,已经改了
| e********3 发帖数: 18578 | 5 因为OOP的三要素之一的polymorphism,java 编译器只会在乎一个变量被申明成什么
type,而不考虑等号右边的赋值语句,那是jvm runtime运行时候才看得东西,所以java
编译器不能判定o在runtime是不是int[] type,因为o被declare是object,所以可能是
任何type,但是会给出class casting warning message.而运行的时候,o实际上是int[
][] type,不能cast到int[],所以jvm会throw一个RuntimeException/
ClassCastException,注意看naming, runtime exception,已经说明了它的含义。
第二个编译不能过,是因为a被declare了为int[][] type,所以java编译器可以确定a一
定是int[][](int[][]没有子类),不能被cast成int[],所以会给出编译错误。
【在 Q****r 的大作中提到】 : int [][] a ={{1,2}, {2,3}}; : Object o = a; : int b = (int []) o; : 编译能通过,但是有ClassCastException在第三句 : 不能理解,为什么能够编译通过? : 如果是 : int [][] a ={{1,2}, {2,3}}; : Object o = a; : int b = (int []) a; : 编译就不能通过了,在第三句。这个很容易理解。
| Q****r 发帖数: 7340 | 6 谢谢阿,很详细
java
int[
【在 e********3 的大作中提到】 : 因为OOP的三要素之一的polymorphism,java 编译器只会在乎一个变量被申明成什么 : type,而不考虑等号右边的赋值语句,那是jvm runtime运行时候才看得东西,所以java : 编译器不能判定o在runtime是不是int[] type,因为o被declare是object,所以可能是 : 任何type,但是会给出class casting warning message.而运行的时候,o实际上是int[ : ][] type,不能cast到int[],所以jvm会throw一个RuntimeException/ : ClassCastException,注意看naming, runtime exception,已经说明了它的含义。 : 第二个编译不能过,是因为a被declare了为int[][] type,所以java编译器可以确定a一 : 定是int[][](int[][]没有子类),不能被cast成int[],所以会给出编译错误。
|
|