Java打破了强大的打字!谁能解释一下?

时间:2011-10-21 08:42:38

标签: java strong-typing

  

可能重复:
  Varying behavior for possible loss of precision

我在编译时发现Java强类型检查不一致。 请查看以下代码:

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.

任何人都可以向我解释一下吗?这是一个已知的错误,或期望的行为? C ++发出警告,C#给出了编译错误。

Java会破坏强类型吗? 您可以将+ =替换为 - =或* = - 编译器可以接受所有内容。

3 个答案:

答案 0 :(得分:28)

此行为由语言定义(因此可以)。来自the JLS

  

15.26.2化合物分配操作员

     

形式E1 op = E2的复合赋值表达式是等价的   到E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1   仅评估一次。例如,以下代码是正确的:

short x = 3;
x += 4.6;
     

并导致x的值为7,因为它相当于:

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

答案 1 :(得分:5)

它编译是因为编译器正在转换

sum += 0.56787;

sum = (int)(sum + 0.56787);

答案 2 :(得分:3)

这与强类型无关,但仅与隐式转换的规则不同。

您正在寻找两个不同的运营商。在第一种情况下,您有简单的赋值运算符“=”,它不允许将double赋给int。在第二种情况下,您具有复合赋值运算符“+ =”,它允许通过首先将double转换为int来向double添加int