¿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)?

Solución

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 a E1 = (T)((E1) op (E2)), donde T es el tipo de E1, excepto que E1 se evalúa sólo 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.

Comentarios (12)

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 resulta que x tiene el valor 7 porque es equivalente a:

&gt short x = 3; x = (short)(x + 4,6);

Comentarios (4)

necesitas pasar de long a int explícitamente en el caso de i = i + l entonces compilará y dará una salida correcta. como

i = i + (int)l;

o

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

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.

Comentarios (1)