包装类中的隐式转换

Mat*_*hur 0 java

我在Java中的Number Wrapper类中感到困惑.

这两个任务看上去对称的-一个char被分配到Integerint分配到Character.但是,第一次任务

Integer i = 'a';
Run Code Online (Sandbox Code Playgroud)

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

Character ch2 = 97;
Run Code Online (Sandbox Code Playgroud)

被允许.为什么?

das*_*ght 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不允许转换charInteger:字符文字始终是类型char.

但是,当你写作

Character ch2 = 97;
Run Code Online (Sandbox Code Playgroud)

Java编译器看到的是97是在有效范围内char(即0..65535),所以它把97作为char,不int,并允许装箱转换.尝试使用超出范围的常量会产生错误:

Character ch3 = 65536; // error: incompatible types: int cannot be converted to Character
Run Code Online (Sandbox Code Playgroud)