Java:为什么不(int)+ =(double)导致"不兼容的类型"错误?

Ale*_*sky 12 java type-conversion

这是一个奇怪的事:

float a = 0;
a = a + Math.PI; // ERROR
Run Code Online (Sandbox Code Playgroud)

但是:

a += Math.PI; // OK!
Run Code Online (Sandbox Code Playgroud)

即便如此:

int b = 0;
b += Math.PI; // OK, too!
Run Code Online (Sandbox Code Playgroud)

为什么+=运算符允许有损隐式类型转换?

ars*_*jii 16

来自JLS§15.26.2:

除了仅计算一次之外,表单的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),where T的类型.E1E1

请注意,复合赋值涉及转换.然而,简单的添加没有演员,因此错误.

如果我们包含演员表,则避免错误:

float a = 0;
a = (float) (a + Math.PI);  // works
Run Code Online (Sandbox Code Playgroud)

这是一个与之x += y相同的常见误解x = x + y.

  • @AleksandrDubinsky:"为什么X设计Y这种方式"不是一个可以在SO上有效回答的问题(除非设计师碰巧在身边). (3认同)
  • "有时候想要"通常不是Java设计师的激励因素(谢天谢地). (2认同)

The*_*Hat 2

那是因为

float a = 0;
double b = 1;
a += b;
Run Code Online (Sandbox Code Playgroud)

相当于

float a = 0;
double b = 1;
a = (float)(a + b);
Run Code Online (Sandbox Code Playgroud)

a +=是相同的a = (<type of a>)(a +