Autoboxing es bastante aterrador. Aunque comprendo plenamente la diferencia entre ==
y .equals
no puedo ayudar pero tiene el error de seguimiento a la mierda de mí:¿Por qué no puede el compilador/JVM simplemente hacer que el autoboxing "simplemente funcione"?
final List<Integer> foo = Arrays.asList(1, 1000);
final List<Integer> bar = Arrays.asList(1, 1000);
System.out.println(foo.get(0) == bar.get(0));
System.out.println(foo.get(1) == bar.get(1));
que imprime
true
false
¿Por qué hacerlo de esta manera? Tiene algo que ver con enteros en caché, pero si ese es el caso, ¿por qué no almacenan en caché todos los enteros utilizados por el programa? ¿O por qué la JVM no siempre se descodifica automáticamente a primitiva?
Imprimir falso falso o cierto verdadero hubiera sido mucho mejor.
EDITAR
que no están de acuerdo acerca de la rotura de código antiguo. Al tener foo.get(0) == bar.get(0)
return true, ya rompió el código.
¿Esto no puede ser resuelto a nivel del compilador mediante la sustitución de enteros con int en el código de bytes (siempre que no se asigna null)
¡simplemente funciona! no de la manera esperada;) – OscarRyz
En realidad, su ejemplo tiene poco que ver con el autoboxing, ese comportamiento es anterior a él. Es cierto que el autoboxing nos obliga a ser más conscientes de él: equals() es la forma (por lo general correcta) de comparar objetos, == es la (única) forma de comparar primitivas ... autoboxing ayuda al programador a tratar Integer e int (casi) indistintamente ... y de ahí el peligro de errores aquí. – leonbloy
Esto puede ser debido a las peculiaridades que también afectan a las instancias de String. Por lo que yo entiendo, hay una agrupación que tiene lugar detrás de las escenas de acuerdo a su valor.Esto se puede prevenir utilizando la palabra clave 'new'. –