问题

直到今天,我才想到这个例子:

 i += j;
 

只是一个捷径:

 i = i + j;
 

但如果我们尝试这个:

 int i = 5;
long j = 8;
 

然后i = i + j;将不编译,但i += j;将编译得很好.

这是否意味着事实上i += j;是这样的快捷方式 i = (type of i) (i + j)?

  最佳答案

与以往一样,JLS保持答案.在这种情况下, 15.26.2 复合转让操作符.提取物:

表单 E1 op= E2 的复合分配表达式相当于 E1 = (T)((E1) op (E2)),其中 TE1 的类型,除了 E1 只评估一次。

15.26.2 引用的一个例子

[...]以下代码正确:

 short x = 3;
x += 4.6;
 

并导致x具有值7,因为它相当于:

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

换句话说,你的假设是正确的。