如果在三元运算符中使用局部变量,为什么从int到short的缩小转换不起作用

ren*_*ene 9 java type-narrowing

编译器(sun-jdk-8u51)接受以下代码行,没有任何警告或错误:

short b = true ? 1 : 1;
Run Code Online (Sandbox Code Playgroud)

而接下来的两个代码行导致编译错误(不兼容的类型:可能从int转换为short的有损转换):

boolean bool = true;
short s = bool ? 1 : 1;
Run Code Online (Sandbox Code Playgroud)

为什么编译器在第二种情况下不能执行原始整数1 的相同缩小转换

ren*_*ene 3

正如 @aioobe 在评论中所述:

这是因为在第一种情况下,由于true是编译时常量,因此整个表达式在编译时计算,因此基本上是short b = 1;这样,而在第二个版本中,编译器不会为您进行简化,因此会出现错误

添加final到变量的声明中bool使其成为常量变量,这也允许编译器解释上面提到的代码。

final boolean bool = true;
short s = bool ? 1 : 1;
Run Code Online (Sandbox Code Playgroud)

参见第 4.12.4 节