jvm 为什么javac检查数组两次?

ni65a41a  于 2022-12-26  发布在  Java
关注(0)|答案(1)|浏览(96)

通过检查字节码,我注意到javac在转换为数组类型时似乎重复了checkcast指令。
Cast.java:

class Cast {
      void test(Object a) {
        Object[] b = (Object[]) a;
      }
    }

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源代码来了解它是如何产生的,以及这是否有助于解释原因(可能是一个提示)。

rqmkfv5c

rqmkfv5c1#

它是javac的一个known bug,但基本上是无害的。

相关问题