协慌网

登录 贡献 社区

为什么 Java 的 + =, - =,* =,/ = 复合赋值运算符需要转换?

直到今天,我还以为:

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);

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

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

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);