2009-03-03 37 views

Respuesta

23

int = int + doble es esencialmente

int = + doble doble

y no se puede hacer eso sin poner ...

El int + = fuerzas de dobles el resultado a un int, mientras el otro requiere casting.

Así a = (int) (a + b);

debe compilar.

Editar: conforme a lo solicitado en los comentarios ... Aquí hay un enlace a más lectura (no la lectura más fácil, pero la información más correcta): http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+0

¿Podría proporcionar algún enlace sobre eso para obtener más información? Gracias – hhafez

+0

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 :( –

+0

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

32

En Java + = operador tiene una conversión implícita a la tipo de mano izquierda. Esto se aplica a todos los operadores compuestos.

+1

Creo que esta es una respuesta más concisa –

4

doble + int devuelve el doble, por lo doble = doble + int es legítima, ver JLS 5.1.2 Ampliación de conversión primitivo por el contrario int = doble + int se "estrechamiento de conversión primitivo" y requiere conversión explícita

0

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) 
Cuestiones relacionadas