Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java breaks strong typing! Who can explain it? [duplicate]

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.

like image 262
Michael P Avatar asked Oct 21 '11 08:10

Michael P


3 Answers

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);
like image 171
McDowell Avatar answered Nov 01 '22 01:11

McDowell


It compiles because the compiler is converting

sum += 0.56787;

to

sum = (int)(sum + 0.56787);
like image 5
John B Avatar answered Nov 01 '22 01:11

John B


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.

like image 3
Ingo Kegel Avatar answered Nov 01 '22 02:11

Ingo Kegel