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