Java Puzzler - 将double转换为int

Ton*_*rte 7 java

int anInt = 1;
double aDouble = 2.5;

anInt = anInt + aDouble; // Error - need to cast double to int

anInt += aDouble; // This is ok. Why?

anInt = aDouble; // This is also an error.

anInt = 1 + aDouble; // This is also an error.
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:为什么不是编译错误anInt += aDouble呢?

das*_*ght 8

四个案例中有三个正确报告错误.复合赋值是规则的唯一例外.Java语言规范,第15.26.2节,解释了原因:

15.26.2复合赋值运算符

除了仅计算一次之外,表单的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),where T的类型.E1E1

例如,以下代码是正确的:

short x = 3;
x += 4.6;
Run Code Online (Sandbox Code Playgroud)

并且结果x的值为7,因为它相当于:

short x = 3;
x = (short)(x + 4.6);
Run Code Online (Sandbox Code Playgroud)

如您所见,隐式插入强制转换可以避免错误.