Почему javac checkcast массивов дважды? - PullRequest
7 голосов
/ 08 марта 2010

Изучая байт-код, я заметил, что javac дублирует checkcast инструкции при приведении к типам массивов.

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, чтобы увидеть, как это происходит, и помогает ли это объяснить причину (может быть, это подсказка).

1 Ответ

8 голосов
/ 08 марта 2010

Это известная ошибка javac. Но это в основном безвредно.

...