Java Puzzler – 将double转换为int

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. 

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

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

15.26.2复合赋值运算符

formsE1 op= E2的复合赋值表达式等效于E1 = (T) ((E1) op (E2)) ,其中TE1的类型,除了E1仅被评估一次。

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

 short x = 3; x += 4.6; 

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

 short x = 3; x = (short)(x + 4.6); 

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