Jvm 为什么javac会两次对数组进行校验?

Jvm 为什么javac会两次对数组进行校验?,jvm,bytecode,javac,jikes,Jvm,Bytecode,Javac,Jikes,在检查字节码时,我注意到javac在转换到数组类型时似乎复制了checkcast指令 Cast.java: class Cast { void test(Object a) { Object[] b = (Object[])b; } } javac编译版本的javap反汇编 void test(java.lang.Object); Code: 0: aload_1 1: checkcast #2; //class "[Ljava/lang/Objec

在检查字节码时,我注意到javac在转换到数组类型时似乎复制了
checkcast
指令

Cast.java:
class Cast {
  void test(Object a) {
    Object[] b = (Object[])b;
  }
}
javac编译版本的javap反汇编

void test(java.lang.Object);
  Code:
   0:   aload_1
   1:   checkcast   #2; //class "[Ljava/lang/Object;"
   4:   checkcast   #2; //class "[Ljava/lang/Object;"
   7:   astore_2
   8:   return
测试jikes显示了预期的单次强制转换

void test(java.lang.Object);
  Code:
   0:   aload_1
   1:   checkcast   #10; //class "[Ljava/lang/Object;"
   4:   astore_2
   5:   return

checkcast
如果对象不能被视为请求的类型,或者什么都不做,那么应该引发异常,所以我不明白为什么它可能有助于使强制转换加倍。我还没有查看JDK源代码来了解它是如何产生的,如果这有助于解释原因(也许这只是一个提示)。

这是javac的一个例子。但它基本上是无害的。

有趣的是。。。其他地方讨论:谢谢参考。我的搜索失败了。你会认为它会被修复,修复起来有多难!