Possible Duplicate:
Varying behavior for possible loss of precision
I found an inconsistence in Java strong typing check at compile time. Please look at the following code:
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.
Can anyone explain it to me? Is it a known bug, or desired behavior? C++ gives a warning, C# gives a compile error.
Does Java breaks strong typing? You can replace += with -= or *= - everything is acceptable by a compiler.
This behaviour is defined by the language (and is therefore OK). From the JLS:
15.26.2 Compound Assignment Operators
A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once. For example, the following code is correct:
short x = 3; x += 4.6;
and results in x having the value 7 because it is equivalent to:
short x = 3; x = (short)(x + 4.6);
It compiles because the compiler is converting
sum += 0.56787;
to
sum = (int)(sum + 0.56787);
This has nothing to do with strong typing but only with different rules for implicit conversions.
You are looking at two different operators here. In the first case, you have the simple assignment operator "=" which does not allow assigning a double
to an int
. In the second case, you have the compound assignment operator "+=" which allows adding a double
to an int
by converting the double
to an int
first.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With