这是一个奇怪的事情:
float a = 0;
a = a + Math.PI; // ERROR
然而:
a += Math.PI; // OK!
即便如此:
int b = 0;
b += Math.PI; // OK, too!
为什么+=
运算符允许有损隐式类型转换?
答案 0 :(得分:16)
来自JLS §15.26.2:
E1 op= E2
形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一次。
请注意,复合赋值涉及转换。但是,简单的添加没有演员,因此错误。
如果我们包含演员表,则避免错误:
float a = 0;
a = (float) (a + Math.PI); // works
x += y
与x = 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 +