Esaminando il bytecode, ho notato che javac sembra duplicare le istruzioni checkcast
quando si esegue il casting su tipi di array.Perché javac esegue il checkcast di array due volte?
Cast.java:
class Cast {
void test(Object a) {
Object[] b = (Object[])b;
}
}
javap lo smontaggio della versione compilata 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
Test jikes mostra il singolo getto previsto
void test(java.lang.Object);
Code:
0: aload_1
1: checkcast #10; //class "[Ljava/lang/Object;"
4: astore_2
5: return
checkcast
si suppone di sollevare un'eccezione se l'oggetto non può essere trattata come il tipo richiesto e altrimenti non fa nulla, quindi non vedo perché potrebbe aiutare a raddoppiare il cast. Non ho guardato le fonti JDK per vedere come è prodotto, e se questo aiuta a spiegare il perché (forse è inteso come un suggerimento).
Interessante ... Discusso altrove: http://mail-archive.ow2.org/asm/2007-07/msg00034.html – polygenelubricants