为什么不是Java的=, - =,* =,/ =复合赋值操作符需要转换?

问题

直到今天,我认为,例如:

i += j;

只是一个捷径:

i = i + j;

但是,如果我们尝试这样做:

int i = 5;
long j = 8;

然后i = i j;不会编译,但是i = j;会编译好。

这是否意味着实际上i = j;是这样的一个快捷方式i =(类型i)(i j)


#1 热门回答(2194 赞)

像这些问题一样,JLS持有答案。在这种情况下,§15.26.2 Compound Assignment Operators。摘录:

形式为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 =(短)(x 4.6);

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


#2 热门回答(438 赞)

这个演员的一个很好的例子是使用* =或/ =

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'

#3 热门回答(221 赞)

非常好的问题。 Java Language specification确认你的建议。

例如,下面的代码是正确的:short x = 3;
x = 4.6;
 并导致x的值为7,因为它等价于:short x = 3;
x =(短)(x 4.6);