¿Por qué los operadores de asignación compuesta +=, -=, *=, /= de Java no requieren conversión?

Resuelto Honza Brabec asked hace 12 años • 12 respuestas

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

Honza Brabec avatar Jan 03 '12 17:01 Honza Brabec
Aceptado

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= E2es equivalente a E1 = (T)((E1) op (E2)), donde Tes el tipo de E1, excepto que E1se 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.

Lukas Eder avatar Jan 03 '2012 10:01 Lukas Eder

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'
Peter Lawrey avatar Jan 03 '2012 10:01 Peter Lawrey

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);
Thirler avatar Jan 03 '2012 10:01 Thirler

Sí,

básicamente cuando escribimos

i += l; 

el compilador convierte esto a

i = (int) (i + l);

Acabo de comprobar el .classcódigo del archivo.

Realmente es bueno saberlo.

Umesh Awasthi avatar Jan 03 '2012 10:01 Umesh Awasthi