【发布时间】:2017-05-09 06:28:45
【问题描述】:
考虑以下代码:
class Converter {
public static void main(String args[]) {
byte num = 1;
num = num * 2.5;
System.out.println("Result is: " + num);
}
}
编译器抛出以下错误:
error: incompatible types: possible lossy conversion from double to the byte at line 1
如果我更改main() 方法的第二行并使用*= 速记运算符:
class Converter {
public static void main(String args[]) {
byte num = 1;
num *= 2.5;
System.out.println("Result is: " + num);
}
}
代码编译运行成功,输出如下:
Result is: 2
为什么*= 速记运算符与完整表达式num = num * 2.5 的行为不同?
【问题讨论】:
-
为什么你认为它不会发生?它基本上是
x = (byte)(x * y)。所以它确实有一个隐式类型转换。我的意思是第一个错误已经在警告您,类型转换将使您在从double转换为byte时失去精确度 -
使用
javap -v Converter.class查看第二种情况发生了什么。特别注意 d2i 和 i2b 指令:) -
所以我可以说速记运算符抑制有损转换错误并简单地执行它的输入吗?
-
没有。你不能。您可以说@SomeJavaGuy 所说的,实际上引用了 JLS,复合赋值(不是“速记”)运算符包括一个强制转换,一个您在非复合示例中省略的强制转换。