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.
复合赋值运算符的行为与其“扩展”版本略有不同。引用JLS 第 15.26.2 节:
\n\n\nE1 op= E2 形式的复合赋值表达式等效于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,但 E1 仅计算一次。
\n
它被隐式地转换回左侧变量的类型,因此将 a 转换float为 an时不会出现错误int;它已经隐式转换为int.
运算符不会发生这种情况=,它受JLS 第 5.2 节“赋值转换”管辖:
\n\n赋值上下文允许使用以下之一:
\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
它继续讨论允许可能的缩小转换,但仅适用于常量表达式,并且仅适用于常量表达式为 a byte、char、short或int,这两者都不适用于此。
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |