【问题标题】:Java: Why doesn't (int) += (double) cause a "incompatible types" error? [duplicate]Java:为什么 (int) += (double) 不会导致“不兼容的类型”错误? [复制]
【发布时间】:2013-12-16 03:19:21
【问题描述】:

这里有一个奇怪的地方:

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

然而:

a += Math.PI; // OK!

即使这样也有效:

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

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

【问题讨论】:

  • 我之前已经在 SO 上阅读过这篇文章,但遗憾的是我无法立即为您找到答案。如果我回来时没有回答,我会再为你搜索。
  • 很奇怪,但是是的,这对我来说是一个众所周知的事实。我想我在一本关于 SCJP 的准备书或其他一些书中遇到了它。这是一个已知的特性,也许这就是语言规范所说的。
  • 如果 arshajii 的回答(或者我的,如果你真的这么认为的话)正确且令人满意地回答了你的问题,你能“接受”它吗?如果两个答案都不令人满意,我建议在问题中添加赏金。

标签: java type-conversion


【解决方案1】:

来自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 相同是一种常见的误解。

【讨论】:

  • 我明白了。一个推论的问题:为什么设计者认为 Java 在其他地方都是强类型的?
  • @AleksandrDubinsky 很难说。我想这是因为您有时可能希望将数字基元增加不同类型的东西(例如,像您一样,将浮点数增加为双精度数)。
  • @AleksandrDubinsky:“为什么 X 以这种方式设计 Y”不是一个可以在 SO 上有用地回答的问题(除非设计师恰好在附近)。
  • “有时想要”通常不是 Java 设计师的激励因素(谢天谢地)。
  • @arshajii 我想我明白了。这是因为byte + byte 实际上总是一个int,所以如果a += b 只是a = a + b,那么+= 永远不能与字节、short 和char 一起使用,或者围绕所有这些的规则将需要变得更复杂。 Java 设计师讨厌复杂的规则。
【解决方案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 + 相同

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 2013-05-23
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多