我一直在准备 OCPJP 21 考试。在学习自动装箱时,我对以下代码片段有一个疑问:
class CharacterAutoboxing {
public static void main(String args[]) {
Character p = 97;
System.out.println(p);
Long l = 116L;
System.out.println(l);
// p = (int)l.longValue();
p = (char)(int)l.longValue();
System.out.println(p);
} // end of main
}
我的查询是Character p = 97
编译器允许的。97 是 int。因此 int 被自动装箱为字符。
那为什么p = (int)l.longValue();
不允许呢?编译器给出异常,因为 int 不能转换为 Character
常量表达式
如果赋值语句的 RHS(右侧)是常量表达式,并且类型是整型基本类型,并且值在 LHS(左侧)类型的范围内,则可将 RHS 的值赋给 LHS,无需强制类型转换。还允许自动装箱。
表达式
97
为常量表达式,其范围为char
。由于表达式为常量,因此编译器能够确定该值在范围内,并且不会发生有损转换。相关的 JLS 规则在JLS 5.2 ...从“此外,如果表达式是常量表达式...”开始。
不是常量表达式
因为RHS表达式不是常量表达式。
由于事实并非如此,编译器不知道该值是什么,因此它不知道赋值不会导致信息丢失。
因此,Java 语言要求您通过使用显式类型转换为 来“确认”潜在的有损转换
char
。然后可以进行自动装箱。注意:编译器给出的是编译错误而不是异常!