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

时间:2011-11-25 17:48:22

标签: java

  

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

代码示例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不会产生任何错误,并且它看起来像在双值1.5之前插入一个显式强制转换为整数。为什么世界会发生这种情况?这违背了我认为我知道的一切!

Test.java:6: possible

 loss of precision

    found   : double
    required: int
            i = i + 1.5;
                  ^
    1 error

2 个答案:

答案 0 :(得分:12)

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

更多信息?

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

答案 1 :(得分:4)

根据Java language specification, section 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);