我在Java中的Number Wrapper Class中感到困惑。
这两个作业看起来是对称的 - char
分配给Integer
,int
分配给Character
。但是,第一次作业
Integer i = 'a';
给出编译错误,而第二个赋值
Character ch2 = 97;
是允许的。为什么呢?
答案 0 :(得分:6)
虽然int i = 'a'
工作正常,但不允许将其转换为Integer
,因为它需要装箱转换。
Java的拳击转换只针对八种情况定义:
boolean
到类型Boolean
byte
到类型Byte
short
到类型Short
char
到类型Character
int
到类型Integer
long
到类型Long
float
到类型Float
double
到类型Double
由于'a'
是char
字面值,因此Java不允许从char
转换为Integer
:字符文字始终为char
类型。< / p>
但是,当你写
时Character ch2 = 97;
Java编译器发现97处于char
的有效范围内(即0..65535),因此它将97
视为char
,而不是int
,并且允许拳击转换。尝试使用超出范围的常量会产生错误:
Character ch3 = 65536; // error: incompatible types: int cannot be converted to Character
答案 1 :(得分:4)
装箱转换的规则可以在Java语言规范第5.1.7页
中找到拳击转换将基本类型的表达式转换为引用类型的相应表达式。具体来说,以下九个转换称为装箱转换:
...后面是从基本类型到引用类型的有效转换列表。
重点是:无论如何,必须进行转换。
如果你有
int a = '97'
没关系;因为这是一个扩大的转换(JLS中的sectin 5.12)。但那个案子
Integer i = '97'
未被列为&#34;有效&#34;自动装箱的转换。换句话说:JLS不允许它;而编译器也没做到这一点。 ......
答案 2 :(得分:0)
Integer i = 'a'
只包裹int i ='a'
。由于'a'
不是int
,因此会抛出错误。
同样,Character ch2 = 97
包裹char ch2 = 97
。但是,97
是一个有效的字符!它代表了角色&#34; a&#34;。例如:
System.out.println((char) 97); //Output: a
答案 3 :(得分:0)
这是因为当将一个字符设置为一个整数时,它会返回一个原始int的ASCII代码。