¿Por qué los operadores de asignación compuesta +=, -=, *=, /= de Java no requieren conversión?
Hasta hoy pensaba que por ejemplo:
i += j;
Fue solo un atajo para:
i = i + j;
Pero si intentamos esto:
int i = 5;
long j = 8;
Entonces i = i + j;
no se compilará pero i += j;
se compilará bien.
¿Significa que en realidad i += j;
es un atajo para algo como esto
i = (type of i) (i + j)
?
Como siempre ocurre con estas preguntas, el JLS tiene la respuesta. En este caso §15.26.2 Operadores de Asignación Compuesta . Un extracto:
Una expresión de asignación compuesta de la forma
E1 op= E2
es equivalente aE1 = (T)((E1) op (E2))
, dondeT
es el tipo deE1
, excepto queE1
se evalúa solo una vez.
Un ejemplo citado de §15.26.2
[...] el siguiente código es correcto:
short x = 3; x += 4.6;
y da como resultado que x tenga el valor 7 porque es equivalente a:
short x = 3; x = (short)(x + 4.6);
En otras palabras, tu suposición es correcta.
Un buen ejemplo de esta conversión es usar *= o /=
byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57
o
byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40
o
char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'
o
char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
Muy buena pregunta. La especificación del lenguaje Java confirma su sugerencia.
Por ejemplo, el siguiente código es correcto:
short x = 3; x += 4.6;
y da como resultado que x tenga el valor 7 porque es equivalente a:
short x = 3; x = (short)(x + 4.6);
Sí,
básicamente cuando escribimos
i += l;
el compilador convierte esto a
i = (int) (i + l);
Acabo de comprobar el .class
código del archivo.
Realmente es bueno saberlo.