Examinando el bytecode, me he dado cuenta de que javac parece duplicar las instrucciones checkcast
al convertir a tipos de matriz.¿Por qué javac checkcast arrays dos veces?
Cast.java:
class Cast {
void test(Object a) {
Object[] b = (Object[])b;
}
}
javap desmontaje de la versión compilada 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
Prueba jikes muestra la única fundición espera
void test(java.lang.Object);
Code:
0: aload_1
1: checkcast #10; //class "[Ljava/lang/Object;"
4: astore_2
5: return
checkcast
se supone que lanzar una excepción si el objeto no puede ser tratada como tipo solicitado y de lo contrario no hace nada, por lo que no veo por qué podría ayudar a duplicar el elenco. No he consultado las fuentes de JDK para ver cómo se produce, y si eso ayuda a explicar el por qué (tal vez sea una pista).
Interesante ... Discutido en otra parte: http://mail-archive.ow2.org/asm/2007-07/msg00034.html – polygenelubricants