OCPJP 21备考疑问:int自动装箱Character的场景差异问题
Character自动装箱的类型转换疑问解答
先看你给出的代码:
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常量,且其值处于char的合法取值范围(0~65535)。根据Java语言规范,编译器会自动将这个int常量隐式窄化转换为char,之后再触发自动装箱(char→Character),所以这行代码合法。对于
p = (int)l.longValue():l.longValue()是运行时计算的long值,强制转成int后依然是运行时的int值,不属于编译期常量。Java不允许把运行时的int值直接赋值给Character引用——自动装箱只支持「基本类型→对应包装类」的直接转换(比如int→Integer、char→Character),不存在int到Character的自动装箱路径。编译器不会自动帮你把int窄化转成char(这可能存在精度丢失风险),必须显式指定转换为char后,才能自动装箱成Character。
而p = (char)(int)l.longValue()合法的原因是:你显式把int值转成了char,此时char类型可以自动装箱为Character,符合自动装箱规则。
内容的提问来源于stack exchange,提问作者Ashish Parab
相关产品推荐
相关产品推荐

