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