在运行时执行强制转换的字节码指令称为checkcast
. 您可以使用反汇编 Java 代码javap
来查看生成了哪些指令。
对于数组,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
在必要时插入指令。
泛型类型和数组的这种类型差异使得它通常不适合混合使用数组和泛型类型。