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