请考虑:
class UnderstandingConversion {
public static void main(String[] args) {
int a=10, b=20;
byte c = (a>b) ? 40 : 50;
System.out.println(c);
// output : lossy conversion error
}
}
这段代码出现了“丢失精度转换”的错误,我理解了。但是,如果我在代码中使用如下所示的final
关键字,则可以正常工作。
class UnderstandingConversion {
public static void main(String[] args) {
final int a=10, b=20;
byte c = (a>b)? 40 : 50;
System.out.println(c);
// Output: 50
}
}
final
在这里是如何起作用的?向下转型是如何进行的?
final
关键字可以使编译器确信变量a和b的值不会发生改变。因此,编译器知道(a>b)? 40 : 50;
将始终为(10>20)? 40 : 50;
,这等同于(false)? 40 : 50;
,进而相当于50
。因此,当您使用final
关键字时,编译器将节省我们在每次调用main
方法时评估(10>20)? 40 : 50;
的时间,并将其替换为结果50
(因为它永远不会改变)。这意味着您最终得到的是byte c = (a>b)? 40 : 50;
(我没有时间查找规范并引用它,因此不想将其发布为答案)。 - Pshemo(condition) ? someInt : someInt
,这导致编译器看到byte c = (a>b)? 40 : 50;
是byte c = someInt;
,这就是为什么会出现错误的原因。其中一个解决方案可以将其中一个结果强制转换为byte
,例如byte c = (a>b) ? 40 : (byte)50;
,这将强制另一个结果也被视为byte
(需要在规范中找到它)。 - Pshemobyte
扩展为int
,而是设计为缩小类型。因此,byte c = (a>b) ? (byte)40 : 50;
强制将50
(即int
)视为byte
(将int
缩小为byte
,因为另一个值是byte
)。 - Pshemo