我读过关于泛型和类型安全性的文章,发现数组在java中不可能是通用的。我还理解了数组的协变性质,它将我引向数组存储异常。我明白为什么会出现这种异常。
我尝试了下面的代码
class SuperClass {
}
class SubClass extends SuperClass {
}
public class ArrayCheck {
public static void main (String args[]) {
SubClass arr[] = new SubClass[10];
arr[0] = new SubClass();
SuperClass[] arr1 = arr;
arr1[1] = new SuperClass();
}
}这就像预期的那样提供了一个ArrayStoreException。我的问题是
ArrayStoreException才会出现,但我错了。因此,我不知道在什么时候出现了这个错误。另外,还需要对Java程序执行过程做一点澄清。
发布于 2020-09-09 08:22:16
我的问题是JVM如何在运行时检查数组类型?
当JVM解释字节码时,解释器在解释aastore字节码指令时执行相关的运行时类型检查。相关的JVM规范链接是https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.aastore。
JIT编译器将将aastore指令转换为执行相同任务的本机代码,尽管它可以优化可以确定为冗余的任何类型检查。
注意,只有当您调整字节码以尝试将引用分配给原始类型的数组时,这种事情才会引起验证者的注意。
在什么时候引发了这个异常?
将值赋值到某个引用类型的数组时,所分配的值与数组的基本类型不兼容。
(请注意,对于基元类型数组,异常不会抛出。如果尝试将long分配给int[],或者将boolean分配给int[],则会得到编译错误。如果您试图将一个int赋值给一个long[],那么它的值将被拓宽。)
https://stackoverflow.com/questions/63806449
复制相似问题