7

バイトコードを調べると、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ソースを見て、それがどのように生成されたかを確認していません.それが理由を説明するのに役立つかどうか(おそらくヒントとして意図されています).

4

1 に答える 1

8

javacの既知のバグです。しかし、それはほとんど無害です。

于 2010-03-08T19:56:06.397 に答える