为什么在隐式地将一个浮点数转换为int时,*=没有给出任何错误?

Sim*_*eke 9 java casting compiler-errors compilation

我之前碰到了一个情况,我尝试了以下两位代码:

int score = 100;
score = score * 1.05;
Run Code Online (Sandbox Code Playgroud)

int score = 100;
score *= 1.05;
Run Code Online (Sandbox Code Playgroud)

第一个失败了(显然是这样,我试图隐式地将一个浮点数转换为int).但第二个工作得非常好.编译器没有抱怨,我没有得到任何运行时错误.为什么第二个工作,而第一个不工作?据我所知,x *= y这只是一个简写x = x * y.

rge*_*man 4

复合赋值运算符的行为与其“扩展”版本略有不同。引用JLS 第 15.26.2 节

\n
\n

E1 op= E2 形式的复合赋值表达式等效于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,但 E1 仅计算一次。

\n
\n

它被隐式地转换回左侧变量的类型,因此将 a 转换float为 an时不会出现错误int;它已经隐式转换为int.

\n

运算符不会发生这种情况=,它受JLS 第 5.2 节“赋值转换”管辖:

\n
\n

赋值上下文允许使用以下之一:

\n
    \n
  • 身份转换 (\xc2\xa75.1.1)

    \n
  • \n
  • 扩大原始转换 (\xc2\xa75.1.2)

    \n
  • \n
  • 扩大引用转换 (\xc2\xa75.1.5)

    \n
  • \n
  • 装箱转换 (\xc2\xa75.1.7)(可选)后跟扩大引用转换

    \n
  • \n
  • 拆箱转换 (\xc2\xa75.1.8)(可选)后跟扩展基元转换。

    \n
  • \n
\n
\n

它继续讨论允许可能的缩小转换,但仅适用于常量表达式,并且仅适用于常量表达式为 a bytecharshortint,这两者都不适用于此。

\n