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

Java: Why doesn't (int) += (double) cause a “incompatible types” error?

本问题已经有最佳答案,请猛点这里访问。

这里有一个奇怪的地方:

1
2
float a = 0;
a = a + Math.PI; // ERROR

然而:

1
a += Math.PI; // OK!

即使这样也行:

1
2
int b = 0;
b += Math.PI; // OK, too!

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


根据JLS第15.26.2条:

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

请注意,有一个与复合赋值相关的强制转换。但是,使用简单的加法没有强制转换,因此会出现错误。

如果我们包括演员表,则可以避免错误:

1
2
float a = 0;
a = (float) (a + Math.PI);  // works

人们普遍错误地认为,x += yx = x + y相同。


那是因为

1
2
3
float a = 0;
double b = 1;
a += b;

相当于

1
2
3
float a = 0;
double b = 1;
a = (float)(a + b);

a +=a = ()(a +相同