包装类中的隐式转换

时间:2017-03-31 18:50:50

标签: java

我在Java中的Number Wrapper Class中感到困惑。

这两个作业看起来是对称的 - char分配给Integerint分配给Character。但是,第一次作业

Integer i = 'a';

给出编译错误,而第二个赋值

Character ch2 = 97;

是允许的。为什么呢?

4 个答案:

答案 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代码。