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乌尔斯。