Java:为什么';t(int)和#x2B;=(双重)原因a“;“不兼容类型”;错误?

Java:为什么';t(int)和#x2B;=(双重)原因a“;“不兼容类型”;错误?,java,type-conversion,Java,Type Conversion,这里有一个奇怪的现象: float a = 0; a = a + Math.PI; // ERROR 然而: a += Math.PI; // OK! 即使这样也行得通: int b = 0; b += Math.PI; // OK, too! 为什么+=运算符允许有损隐式类型转换?这是因为 float a = 0; double b = 1; a += b; 相当于 float a = 0; double b = 1; a = (float)(a + b); a+=与a=()(a+来

这里有一个奇怪的现象:

float a = 0;
a = a + Math.PI; // ERROR
然而:

a += Math.PI; // OK!
即使这样也行得通:

int b = 0;
b += Math.PI; // OK, too!
为什么
+=
运算符允许有损隐式类型转换?

这是因为

float a = 0;
double b = 1;
a += b;
相当于

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

来自:

形式为
E1 op=E2
的复合赋值表达式等价于
E1=(T)((E1)op(E2))
,其中
T
E1
的类型,除了
E1
仅计算一次之外

注意,复合赋值涉及一个cast。但是,简单加法没有cast,因此出现了错误

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

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

这是一个常见的误解,认为
x+=y
x=x+y

完全相同,我以前读过这篇文章,但遗憾的是,我现在找不到你的答案。如果我回来时没有找到答案,我会再为你搜索一点。奇怪的是,这是我已知的事实。我想我在一本关于s的准备书中见过它这是一个已知的特性,也许这就是语言规范所说的。看看arshajii的答案(或者我的答案,如果你真的这么认为的话)是否正确且令人满意地回答了你的问题,你能“接受”吗它?如果两个答案都不令人满意,我会建议给这个问题增加一个奖励。我明白了。一个推论问题:为什么设计师认为在其他地方Java都是强类型的时候这是一个好主意?@AleksandrDubinsky很难说。我想这是因为有时你可能想通过某种方式增加数字原语另一种类型(例如,一个双精度浮点)。@AleksandrDubinsky:“为什么X这样设计Y”不是一个可以有效回答的问题(除非设计师碰巧在场)。“有时想要”通常不是Java设计师的激励因素(谢天谢地)@arshajii我想我明白了。这是因为
byte+byte
实际上总是一个
int
,所以如果
a+=b
只是
a=a+b
,那么要么
+=
不能与byte、short和char一起使用,要么围绕这一切的规则需要变得更复杂。Java设计师讨厌复杂的r乌尔斯。