Почему делает javac checkcast массивы дважды?

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

7
задан Brandon 8 March 2010 в 19:50
поделиться