Java打破了强类型化!谁能解释呢?

2022-09-03 04:23:47

可能的重复:
改变行为以可能损失精度

我在编译时发现了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会破坏强类型吗?您可以将 += 替换为 -= 或 *= - 编译器可以接受所有内容。


答案 1

此行为由语言定义(因此是可以的)。来自 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);

答案 2

它之所以编译,是因为编译器正在转换

sum += 0.56787;

sum = (int)(sum + 0.56787);

推荐