¿Por qué los operadores de asignación compuesta +=, -=, *=, /= de Java no requieren fundición?
Hasta hoy, pensaba que, por ejemplo:
i += j;
era sólo un atajo para:
i = i + j;
Pero si probamos esto:
int i = 5;
long j = 8;
Entonces i = i + j;
no compilará pero i += j;
compilará bien.
¿Significa esto que en realidad i += j;
es un atajo para algo como esto
i = (tipo de i) (i + j)
?
3539
3
Como siempre con estas preguntas, el JLS tiene la respuesta. En este caso §15.26.2 Operadores de asignación compuestos. 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 sólo una vez.Un ejemplo citado de §15.26.2
En otras palabras, tu suposición es correcta.
Muy buena pregunta. La especificación del lenguaje Java confirma su sugerencia.
Por ejemplo, el siguiente código es correcto:
necesitas pasar de
long
aint
explícitamente
en el caso dei = i + l
entonces compilará y dará una salida correcta. comoo
pero en el caso de
+=
funciona bien porque el operador hace implícitamente el cambio de tipo de la variable de la derecha al tipo de la variable de la izquierda, por lo que no es necesario el cambio explícito.