检查字节码,我注意到 javaccheckcast
在转换为数组类型时似乎重复了指令。
Cast.java:
class Cast {
void test(Object a) {
Object[] b = (Object[])b;
}
}
javap反汇编的javac编译版本
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 源代码来了解它是如何产生的,如果这有助于解释原因(也许它是一个提示)。