La especificación del lenguaje Java define E1 op= E2
ser equivalente a E1 = (T) ((E1) op (E2))
donde T
es un tipo de E1
y E1
se evalúa una vez .
Esa es una respuesta técnica, pero puede que se pregunte por qué es así. Bueno, consideremos el siguiente programa.
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
¿Qué imprime este programa?
¿Adivinaste 3? Lástima, este programa no se compilará. ¿Por qué? Bueno, sucede que la adición de bytes en Java se define para devolver unint
. Esto, creo que fue porque la máquina virtual Java no define operaciones de byte para guardar en códigos de byte (después de todo, hay un número limitado de ellas), el uso de operaciones enteras es un detalle de implementación expuesto en un lenguaje.
Pero si a = a + b
no funciona, eso significaría a += b
que nunca funcionaría para bytes si se E1 += E2
definiera como tal E1 = E1 + E2
. Como muestra el ejemplo anterior, ese sería el caso. Como un truco para hacer que el +=
operador funcione para bytes y cortos, hay un elenco implícito involucrado. No es un gran truco, pero durante el trabajo de Java 1.0, el enfoque se centró en liberar el lenguaje para empezar. Ahora, debido a la compatibilidad con versiones anteriores, este truco introducido en Java 1.0 no se pudo eliminar.