x = x*0.90;给出有损转换错误。 x*=0.90;才不是。为什么?

问题描述 投票:0回答:1

我已经写好了代码:

        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 integer double multiplication assignment-operator
1个回答
0
投票

因为 Java 语言规范 (JLS) 是这么说的。这有点奇怪,但是,当使用复合赋值运算符(

*=
+=
等)时,隐含了强制转换。

参见 JLS §15.26.2,它清楚地显示了该部分顶部示例中的演员阵容。

为什么要这么做?好吧,我认为 SO 不是询问“30 年前编写 JLS 规范的这一部分时设计师在想什么”的合适地方。如果我不得不在黑暗中进行一次完全疯狂的尝试,这可能与几乎所有奇怪的 java lang 规范决策背后的原因相同:“因为 C 就是这样做的”。

此时您可能会问为什么 C 设计者要这样做。可能是因为B就是这样做的。这时你可能会问为什么 B 设计师要这么做。幸运的是,或多或少有相同的人(肯·汤普森和丹尼斯·里奇)。他们还活着,分别80岁和70岁。据我所知,他们并不在 Stack Overflow 上闲逛。

© www.soinside.com 2019 - 2024. All rights reserved.