隐式变量铸造

时间:2016-11-18 20:39:42

标签: java char

为什么会这样,

char ch = 9 + '0';
System.out.println(ch);

会导致,

9

但是,

int k = 9;
char ch = k + '0';
System.out.println(ch);

将返回

"Type mismatch: cannot convert from int to char"

3 个答案:

答案 0 :(得分:1)

编译器知道9 + '0'是57,它适合16位char值。编译器不跟踪变量赋值(静态最终常量除外),因此无法确定k + '0'的值是否适合16位。

16位大小限制也是为什么你也会得到相同的编译器错误:

char ch = 10_000_000 + '0';

答案 1 :(得分:1)

JLS Sec 5.2

中对此进行了描述
  

5.2分配上下文

     

...

     

如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

     
      
  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
  •   
     

...

     

示例:常量表达式的编译时缩小意味着代码如:

byte theAnswer = 42;
     

是允许的。

这适用于您的示例,因为9 + '0'是一个常量,并且可以静态地确定它适合char。因此,演员阵容可以隐含地完成。

另一方面,k不是常量,因此编译器无法确定k + '0'是否适合char;因此,它需要一个明确的演员。

答案 2 :(得分:-1)

使用9 + '0'时,编译器使用字符的ASCII值并将其添加到 literal(9)值,然后将其转换回char 即。

9 + 48 = 57
57 ACII -->= '9' (char)

使用k + '0'时 k被声明为int和' 0'是char。编译器不会在这里编译,因为它们是不同的类型,而目标更小以适应结果值。