2011-11-25 11 views
18

Duplicar posibles:
Varying behavior for possible loss of precision¿Por qué Java realiza conversión de tipo implícito de doble a entero cuando se utiliza el operador "más iguales"?

código de ejemplo Un

public class Test {               
    public static void main(String[] args) { 
     int i = 0; 
     i = i + 1.5; 
    } 
} 

Código Muestra B

public class Test {               
    public static void main(String[] args) { 
     int i = 0; 
     i += 1.5; 
    } 
} 

Unsurprisin gly, compilando A produce el siguiente error. Sorprendentemente, la compilación B no produce ningún error y parece comportarse como si insertara un molde explícito en entero antes del valor doble 1.5. ¿Por qué en el mundo sucede esto? ¡Esto va en contra de todo lo que pensé que sabía!

Test.java:6: possible 

loss of precision 

    found : double 
    required: int 
      i = i + 1.5; 
       ^
    1 error 
+1

@Dave está justo en la parte desconcertante. Oh, bueno, ningún idioma es perfecto. :) –

Respuesta

13

Está trabajando como está diseñado. Los operadores compuestos agregan un molde implícito a la operación. De lo contrario, debe usar un lanzamiento explícito.

Más información?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+2

+1 Buena respuesta, pero aquí hay un enlace más directo: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5304 –

+1

Lo suficiente sobre el enlace. ¡Gracias! – Mechkov

+0

Impresionante, gracias por el enlace, Ray. – danmcardle

4

Según la Java language specification, section 15.26.2:

Una expresión de asignación compuesto de la op forma E1 = 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 los resultados en X que tiene el valor 7, ya que es equivalente a:

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