Como todos ya han indicado, el + = tiene un lanzamiento implícito. Para ayudar a ilustrar eso, voy a utilizar una aplicación que escribí hace un tiempo que es perfecta para este tipo de preguntas. Es un desensamblador línea para que pueda revisar el código de bytes real que se está produciendo: http://javabytes.herokuapp.com/
y una mesa de sus significados: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
Así que vamos a echar un vistazo al código de bytes de algún código Java simple:
int i = 5;
long j = 8;
i += j;
Código desensamblado. 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)
¿Podría proporcionar algún enlace sobre eso para obtener más información? Gracias – hhafez
creo que el motivo "profundo" se debe a que no se permite asignar mientras se estrecha: byte = int no se permite e int = double también. uno haría un byte simple a; a + = 2; y no compilan, la gente arrojaría zapatos a java. pero aún me hubiera gustado tener reglas adicionales que lo hagan funcionar sin ese molde :( –
No estoy seguro de que haya una razón profunda, pero la especificación del lenguaje Java define explícitamente el elenco implícito: http://java.sun.com/ docs/books/jls/second_edition/html/expressions.doc.html # 5304 – DefLog