用于在运行时执行转换的字节码指令称为checkcast
。您可以使用javap
来反汇编Java代码,以查看生成了哪些指令。
对于数组,Java在运行时保留类型信息。在大多数情况下,编译器会为您捕获类型错误,但是在某些情况下,当您ArrayStoreException
尝试将对象存储在数组中时会遇到,但是类型不匹配(并且编译器没有捕获到它) 。在Java语言规范给出了下面的例子:
class Point { int x, y; }
class ColoredPoint extends Point { int color; }
class Test {
public static void main(String[] args) {
ColoredPoint[] cpa = new ColoredPoint[10];
Point[] pa = cpa;
System.out.println(pa[1] == null);
try {
pa[0] = new Point();
} catch (ArrayStoreException e) {
System.out.println(e);
}
}
}
Point[] pa = cpa
有效,因为它ColoredPoint
是Point的子类,但pa[0] = new Point()
无效。
这与泛型类型相反,泛型类型在运行时不保留任何类型信息。编译器checkcast
在必要时插入指令。
泛型类型和数组在类型上的差异使得它通常不适合将数组和泛型类型混合使用。