¿Por qué las asignaciones de operador de asignación de Java + =, - =, * =, / = no requieren conversión?

Hasta hoy, pensé, por ejemplo:

 i += j; 

Solo había una etiqueta para:

 i = i + j; 

Pero si intentamos esto:

 int i = 5; long j = 8; 

Entonces i = я + j; no compilará, pero i += j; se compilará bien.

¿Significa esto que i += j; es la etiqueta para algo como esto i = (type of i) (i + j) ?

3326
03 янв. fijado por Honza Brabec el 3 de enero 2012-01-03 13:10 '12 a las 13:10 2012-01-03 13:10
@ 11 respuestas

Como siempre con estas preguntas, el JLS tiene la respuesta. En este caso §15.26.2 Sentencias de asignación de conexión . La exposición

La expresión acumulativa de la expresión E1 op= E2 equivalente a E1 = (T)((E1) op (E2)) , donde T es el tipo de E1 , excepto que E1 se evalúa solo una vez.

Ejemplo dado en §15.26.2

el código correcto:

 short x = 3; x += 4.6; 

y hace que x tenga un valor de 7, porque es equivalente a:

 short x = 3; x = (short)(x + 4.6); 

En otras palabras, tu conjetura es correcta.

2241
03 янв. La respuesta es dada por Lukas Eder el 3 de enero. 2012-01-03 13:15 '12 a las 13:15 2012-01-03 13:15

Un buen ejemplo de este reparto es * = 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 
border=0

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' 
450
03 янв. Respuesta dada por Peter Lawrey Ene 03 2012-01-03 13:20 '12 a las 13:20 2012-01-03 13:20

Muy buena pregunta. La especificación del lenguaje Java confirma su oferta.

Por ejemplo, el siguiente código es correcto:

 short x = 3; x += 4.6; 

y hace que x tenga un valor de 7, porque es equivalente a:

 short x = 3; x = (short)(x + 4.6); 
231
03 янв. La respuesta la da Thirler el 3 de enero. 2012-01-03 13:17 '12 a las 13:17 2012-01-03 13:17

Si

sobre todo cuando escribimos

 i += l; 

el compilador convierte este valor a

 i = (int)(i + l); 

Acabo de comprobar el código del archivo .class .

Muy bueno saber

169
03 янв. la respuesta se da Umesh Awasthi 03 jan. 2012-01-03 13:19 '12 a las 13:19 2012-01-03 13:19

Debe hacerlo de long a int explicitly en el caso de i = i + l , luego compilará y dará el resultado correcto. 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 += simplemente funciona bien, porque el operador realiza implícitamente la conversión de tipos desde el tipo de la variable derecha al tipo de la variable izquierda, por lo que no es necesario especificar explícitamente.

86
03 янв. la respuesta se da dku.rajkumar 03 jan. 2012-01-03 13:15 '12 a las 13:15 2012-01-03 13:15

El problema aquí es el casting.

Cuando añades int y long,

  • El objeto int se almacena en un espacio largo y ambos se agregan, y se obtiene un objeto largo.
  • pero un objeto largo no se puede pasar implícitamente a un int. Así que debes hacerlo explícitamente.

Pero += codificado de tal manera que se escribe. i=(int)(i+m)

57
03 янв. La respuesta la da Dinesh Sachdev 108 03 jan. 2012-01-03 13:20 '12 a las 13:20 2012-01-03 13:20

En las conversiones de tipo Java, esto se hace automáticamente cuando el tipo de expresión en el lado derecho de la operación de asignación se puede mover de manera segura al tipo de la variable en el lado izquierdo del trabajo. Por lo tanto, podemos asignar con seguridad:

  byte -> short -> int -> long -> float -> double. 

Lo mismo no va a funcionar al revés. Por ejemplo, no podemos convertir automáticamente largo a int, porque el primero requiere más memoria que el segundo y, por lo tanto, la información puede perderse. Para forzar tal transformación, debemos realizar una conversión explícita.
Tipo - Conversión

48
23 янв. La respuesta se da tinker_fairy 23 de enero 2013-01-23 08:50 '13 a las 8:50 2013-01-23 08:50

A veces esta pregunta se puede hacer en la entrevista.

Por ejemplo, cuando escribes:

 int a = 2; long b = 3; a = a + b; 

No hay conversión automática de tipos. En C ++, no habrá ningún error de compilación del código anterior, pero en Java se obtiene algo así como una Incompatible type exception .

Para evitar esto, debes escribir tu código así:

 int a = 2; long b = 3; a += b;// No compilation error or any exception due to the auto typecasting 
38
02 дек. Respuesta dada por Stopfan 02 dic. 2014-12-02 13:40 '14 a las 13:40 2014-12-02 13:40

La principal diferencia es que con a = a + b no hay conversión de tipo y, por lo tanto, el compilador está enfadado contigo por no escribir. Pero con a += b , lo que realmente está haciendo es convertir el tipo b en un tipo compatible con a . Así que si lo haces

 int a=5; long b=10; a+=b; System.out.println(a); 

¿Qué estás haciendo realmente?

 int a=5; long b=10; a=a+(int)b; System.out.println(a); 
19
08 июня '15 в 2:27 2015-06-08 02:27 la respuesta se da takra 08 de junio de '15 a las 2:27 2015-06-08 02:27

El punto fino aquí ...

Hay un i+j implícito para i+j cuando j es doble, e i es un int. Java SIEMPRE convierte un número entero en un doble al realizar una operación entre ellos.

Para aclarar i+=j donde i es un número entero y j es doble, se puede describir como

 i = <int>(<double>i + j) 

Ver esta descripción de fundición implícita.

En este caso, es posible que necesite convertir j a (int) para mayor claridad.

8
18 янв. Respuesta dada por Gabe Nones 18 de enero. 2016-01-18 23:07 '16 a las 11:07 PM 2016-01-18 23:07

En el caso de un operador de asignación, se realiza un inicio automático del tipo interno:

 byte b1 = 10; //b1 = b1 + 1; Compile time error because found int System.out.println(b1); byte b3 = 10; b3 += 1; //in compound assignment implicit type casting will be performed simultaneously System.out.println("b3=: "+b3); byte b4 = 127; b4 += 3; //in compound assignment implicit type casting will be performed simultaneously System.out.println("b4=: "+b4);//-126 

Y en algunos casos perderás algo de valor:

 int i = 1; i += 1.5; System.out.println("i=: "+i); //will print 2, and you lost .5 !!! 
-3
04 июня '17 в 11:03 2017-06-04 11:03 Suganthan Madhavan Pillai da la respuesta el 4 de junio de '17 a las 11:03 2017-06-04 11:03