为什么Java在使用“plus equals”运算符时执行从double到整数的隐式类型转换?

可能重复:
不同的行为可能会导致精度下降

代码示例A.

public class Test { public static void main(String[] args) { int i = 0; i = i + 1.5; } } 

代码示例B.

  public class Test { public static void main(String[] args) { int i = 0; i += 1.5; } } 

不出所料,编译A会产生以下错误。 令人惊讶的是 ,编译B不会产生任何错误,并且它似乎表现得好像我在double值1.5之前将显式转换插入整数。 为什么世界会发生这种情况? 这违背了我认为我知道的一切!

 Test.java:6: possible loss of precision found : double required: int i = i + 1.5; ^ 1 error 

它按设计工作。 复合运算符向操作添加隐式强制转换。 否则你必须使用显式强制转换。

更多信息?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

根据Java语言规范,第15.26.2节 :

formsE1 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);