tipos significa que presionan presion prension personas para muy mucho mejorar marcado lapiz hijo fuerte escribir ejercicios con aprieta agarre java strong-typing

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);