我在这个时期正在研究仿制药,今天我发现了这个谜。
让我们考虑以下虚拟类:
public class Main{
public static void main(String[] args) {
Container<Integer> c = new Container<Integer>();
c.getArray(); //No Exception
//c.getArray().getClass(); //Exception
//int a = c.getArray().length; //Exception
}
}
class Container<T> {
T[] array;
@SuppressWarnings("unchecked")
Container() {
array = (T[])new Object[1];
}
void put(T item) {
array[0] = item;
}
T get() { return array[0]; }
T[] getArray() { return array; }
}
因为擦除,在运行时,getArray() 方法的 T[] 返回类型变成了 Object[],这对我来说是完全合理的。
如果我们按原样访问该方法 (c.getArray()),则不会引发异常,但是如果我们尝试在返回的数组上调用某些方法,例如 c.Array().getClass(),或者如果我们尝试访问一个字段,例如 c.getArray().length,则抛出以下异常:
线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为 [Ljava.lang.Integer;
为什么会抛出这个异常?为什么简单的 c.getArray() 调用也不抛出它?如果我们只是调用 getClass() 或访问长度,为什么它会尝试转换为 Integer[]?getClass() 和长度是否也不适用于 Object[]?
提前感谢您的许多(我希望)和解释性(我也希望如此)的答案。