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

时间:2013-11-29 22:13:29

标签: java type-conversion

这是一个奇怪的事情:

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

然而:

a += Math.PI; // OK!

即便如此:

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

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

2 个答案:

答案 0 :(得分:16)

来自JLS §15.26.2

  

E1 op= E2形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2)),其中TE1的类型,但E1仅被评估一次。

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

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

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

x += yx = x + y相同,这是一种常见的误解。

答案 1 :(得分:2)

那是因为

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

相当于

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

a +=a = (<type of a>)(a +

相同