java - presionan - que significa escribir muy marcado
Java rompe la escritura fuerte! ¿Quién puede explicarlo? (3)
Posible duplicado:
Comportamiento variable por posible pérdida de precisión.
Encontré una incoherencia en la comprobación de tipificación fuerte de Java en el momento de la compilación. Por favor mira el siguiente código:
int sum = 0;
sum = 1; //is is OK
sum = 0.56786; //compile error because of precision loss, and strong typing
sum = sum + 2; //it is OK
sum += 2; //it is OK
sum = sum + 0.56787; //compile error again because of automatic conversion into double, and possible precision loss
sum += 0.56787; //this line is does the same thing as the previous line, but it does not give us a compile error, and javac does not complain about precision loss etc.
¿Puede alguien explicármelo? ¿Es un error conocido, o comportamiento deseado? C ++ da una advertencia, C # da un error de compilación.
¿Java rompe la tipificación fuerte? Puede reemplazar + = con - = o * = - todo es aceptable por un compilador.
Este comportamiento está definido por el lenguaje (y por lo tanto está bien). Desde el JLS :
15.26.2 Operadores de asignación de compuestos
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);
Esto no tiene nada que ver con la escritura fuerte, sino solo con reglas diferentes para las conversiones implícitas.
Usted está mirando a dos operadores diferentes aquí. En el primer caso, tiene el operador de asignación simple "=" que no permite asignar un double
a un int
. En el segundo caso, tiene el operador de asignación compuesta "+ =" que permite agregar un double
a un int
convirtiendo el double
a un int
primero.
Se compila porque el compilador está convirtiendo.
sum += 0.56787;
a
sum = (int)(sum + 0.56787);