关于程序员对 Java 类型系统的理解,比较高级的一个面试问题是这样:
public static void f() {
String[] a = new String[2];
Object[] b = a;
a[0] = "hi";
b[1] = Integer.valueOf(42);
}
注意这里所谓的「错了」是本质上,原理上的,而不一定是 Java 编译器,IDE 或者运行时报给你的。也就是说,你用的 Java 实现,IDE 都可能是错的,没找对真正错误的地方,或者没告诉你真正的原因。
如果你知道哪里错了,并且知道「为什么」错了,可以联系我。
错误在第5行
首先Object[] b = a; 此时b指向的就是a,b和a本质上就是一样的都是String类型的数组,但是b定义的是Object类型的数组,所以在编译时候,b存入的值只要是Object类型即不会报错,这也是多态的编译看左边,所以在写代码的时候编译阶段b[1] = Integer.valueOf(42);给b[1]赋值是Integer类型,Integer属于Object的子类,故编译不会报错。在运行时,会找b的真正类型进行确认再进行赋值,此时找到的b的真正类型是String数组,而要给b赋值是Integer类型就会报错了。