Java中final关键字如何触发向下转型?代码示例解析
为什么final关键字能让三元表达式的int到byte转换通过编译?
先看第一段报错的代码:
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 } }
这段代码报错的核心原因是:a和b是普通int变量,编译器在编译期无法确定a>b的结果——哪怕我们肉眼能看出结果是false,但编译器不会做这种运行时预判。因此三元表达式(a>b)? 40 : 50的结果会被认定为int类型(毕竟40、50都是int字面量),而int的取值范围远大于byte,直接赋值给byte变量c时,编译器会判定存在损失性转换风险,因此抛出错误。
再看添加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的关键作用是把a和b标记为编译时常量:
- 被
final修饰的基本类型变量,一旦用字面量赋值后就无法再被修改,编译器会在编译阶段就确定它们的固定值。 - 基于这个特性,编译器能直接算出
a>b的结果是false,三元表达式的结果也就固定为50,不再是一个不确定的int值。
关于向下转型(窄化转换)的发生:
编译器确定了三元表达式的结果是常量50,而50刚好在byte的取值范围(-128到127)内,所以编译器会自动执行隐式窄化转换,把int类型的50转换成byte类型,不需要我们写显式的强制转换代码,自然就能正常编译运行了。
内容的提问来源于stack exchange,提问作者Yash Deole
相关产品推荐
相关产品推荐

