Java: Why doesn't (int) += (double) cause a “incompatible types” error?
这里有一个奇怪的地方:
1 2
| float a = 0;
a = a + Math. PI; // ERROR |
然而:
即使这样也行:
1 2
| int b = 0;
b += Math. PI; // OK, too! |
为什么+=运算符允许有损隐式类型转换?
- 我以前读过这本书,但遗憾的是我不能马上为你找到答案。如果我回来时它没有回答,我会为你再找一点。
- 很奇怪,但对我来说这是个众所周知的事实。我想我在一本关于SCJP的准备书或其他一些书中见过它。这是一个已知的特性,也许这就是语言规范所说的。
- 请参阅stackoverflow.com/questions/8710619/java-operator
- 如果阿沙吉的回答(或者我的,如果你真的这么认为的话)正确而令人满意地回答了你的问题,你能"接受"它吗?如果两个答案都不令人满意,我建议在这个问题上再加一笔赏金。
根据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 += y与x = x + y相同。
- 我懂了。一个必然的问题:当其他Java都是强类型的时,为什么设计者认为这是个好主意?
- @很难说亚历山大·杜宾斯基。我想这是因为有时您可能希望用不同类型的东西(例如,使用双精度浮点)来增加数值原语。
- @Aleksandrdubinsky:"为什么X要这样设计Y"不是一个可以有效回答的问题(除非设计师正好在附近)。
- "有时想要"通常不是Java设计师的激励因素(谢天谢地)。
- 认为您希望将字节值增加一定的偏移量。字节TI Java 7没有文字。如果需要显式的强制转换,这样的代码就会变得非常冗长。
- @亚历山大杜宾斯基,我不可能对你的评论给出更具体的回答。
- @我想我明白了。这是因为byte + byte总是一个int,所以如果a += b只是a = a + b,那么+=就不能与byte、short和char一起使用,或者围绕这一切的规则需要变得更加复杂。Java设计者讨厌复杂的规则。
那是因为
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 +相同