descargar - ¿Por qué Java realiza una conversión de tipo implícita de doble a entero cuando se usa el operador "más es igual a"?
java offline (2)
Según la java.sun.com/docs/books/jls/third_edition/html/… :
Una expresión de asignación compuesta de la forma E1 op = E2 es equivalente a E1 = (T) ((E1) op (E2)), donde T es el tipo de E1, excepto que E1 se evalúa solo una vez. 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);
Posible duplicado:
Comportamiento variable por posible pérdida de precisión.
Ejemplo de código A
public class Test {
public static void main(String[] args) {
int i = 0;
i = i + 1.5;
}
}
Ejemplo de código B
public class Test {
public static void main(String[] args) {
int i = 0;
i += 1.5;
}
}
Como era de esperar, la compilación A produce el error siguiente. Sorprendentemente , la compilación de B no produce ningún error y parece que se comporta como si insertara una conversión explícita a entero antes del valor doble 1.5. ¿Por qué en el mundo sucede esto? ¡Esto va en contra de todo lo que creía saber!
Test.java:6: possible
loss of precision
found : double
required: int
i = i + 1.5;
^
1 error
Está funcionando como fue diseñado. Los operadores compuestos agregan un lanzamiento implícito a la operación. De lo contrario tienes que usar un reparto explícito.
¿Más información?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2