バイトコードを調べると、javaccheckcast
が配列型にキャストするときに命令が重複しているように見えることに気付きました。
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
ジクをテストすると、予想されるシングルキャストが表示されます
void test(java.lang.Object);
Code:
0: aload_1
1: checkcast #10; //class "[Ljava/lang/Object;"
4: astore_2
5: return
checkcast
オブジェクトを要求された型として扱うことができず、それ以外の場合は何もしない場合に例外を発生させることになっているため、キャストを2倍にすることが役立つ理由がわかりません。私はJDKソースを見て、それがどのように生成されたかを確認していません.それが理由を説明するのに役立つかどうか(おそらくヒントとして意図されています).