直到今天,我还以为:
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)),其中T是E1的类型,除了E1仅被评估一次。
§15.26.2引用的一个例子
[...] 以下代码是正确的:
short x = 3; x += 4.6;并且结果 x 的值为 7,因为它相当于:
short x = 3; x = (short)(x + 4.6);
换句话说,你的假设是正确的。
这个演员的一个很好的例子是使用 * = 或 / =
byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57要么
byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40要么
char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'要么
char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
非常好的问题。 Java 语言规范确认了您的建议。
例如,以下代码是正确的:
short x = 3; x += 4.6;并且结果 x 的值为 7,因为它相当于:
short x = 3; x = (short)(x + 4.6);