reverseorder que array java types type-conversion operators implicit-conversion

java - que - ¿Cuál es la diferencia entre double a=a+int b e int a+= double b?



collections reverseorder java (4)

Por que:

public class Addition { public static void main() { int a = 0; double b = 1.0; a = a + b; System.out.println(a); } }

no compilar pero

public class Addition { public static void main() { int a = 0; double b = 1.0; a += b; System.out.println(a); } }

compila


Como todos ya han dicho, el + = tiene un reparto implícito. Para ayudar a ilustrar eso, voy a usar una aplicación que escribí hace un tiempo que es perfecta para este tipo de preguntas. Es un desensamblador en línea para que pueda ver el código de bytes real que se produce: http://javabytes.herokuapp.com/

Y una tabla de sus significados: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

Así que echemos un vistazo al bytecode de un código Java simple:

int i = 5; long j = 8; i += j;

Código desmontado. Mis comentarios tendrán un // en frente.

Code: 0: iconst_5 //load int 5 onto stack 1: istore_0 //store int value into variable 0 (we called it i) 2: ldc2_w #2; //long 8l //load long 8 value onto stack. Note the long 8l above //is not my comment but how the disassembled code displays //the value long 8 being used with the ldc2_w instruction 5: lstore_1 //store long value into variable 1 (we called it j) 6: iload_0 //load int value from variable 0 7: i2l //convert int into a long. At this point we have 5 long 8: lload_1 //load value from variable 1 9: ladd //add the two values together. We are adding two longs //so it''s no problem 10: l2i //THIS IS THE MAGIC. This converts the sum back to an int 11: istore_0 //store in variable 0 (we called it i)


En Java + = el operador tiene un lanzamiento implícito al tipo de mano izquierda. Esto se aplica a todos los operadores compuestos.


double + int devuelve el doble, por lo que double = double + int es legítimo, consulte JLS 5.1.2. Ampliación de la conversión de primitiva, por otro lado int = double + int es "Conversión de conversión primitiva" y requiere un lanzamiento explícito.


int = int + double es esencialmente

int = doble + doble

y no puedes hacer eso sin lanzar ...

El int + = double fuerza el resultado a un int mientras que el otro requiere casting.

Entonces a = (int) (a + b);

debe compilar.

Editar: como se solicitó en los comentarios ... aquí hay un enlace a más lecturas (no la más fácil de leer, pero la información más correcta): http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2