我已经写了代码:
int x = 18;
x *= 0.90;
System.out.println(x);
这段代码打印出来16
然而,当我写下
int x = 18;
x = x * 0.90;
System.out.println(x);
它给了我以下错误:incompatible types: possible lossy conversion from double to int
我预计这两个代码示例都会导致与 相同的错误x *= y;
,x = x * y;
但x *= 0.90;
不知何故有效,但x = x * 0.90;
无效。为什么会这样呢?
因为 Java 语言规范 (JLS) 是这么说的。这有点奇怪,但是,当使用复合赋值运算符(
*=
、+=
等)时,隐含了强制转换。请参阅JLS §15.26.2,它清楚地显示了该部分顶部示例中的演员表。
为什么要这样做?好吧,我认为 SO 不是询问“30 年前编写 JLS 规范的这一部分时设计师在想什么”的合适地方。如果我不得不在黑暗中进行一次完全疯狂的尝试,那么这可能与几乎所有奇怪的 java lang 规范决策背后的原因相同:“因为 C 就是这样做的”。
此时您可能会问为什么 C 设计者要这样做。可能是因为B就是这样做的。这时你可能会问为什么 B 设计师要这么做。幸运的是,或多或少有相同的人(肯·汤普森和丹尼斯·里奇)。他们还活着,分别80岁和70岁。据我所知,他们并不在 Stack Overflow 上闲逛。