为什么我可以在没有显式强制转换的情况下将int分配给char变量?

时间:2011-09-03 23:25:46

标签: java casting

我想知道为什么这个代码段有用。

char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);

在第2行中,右侧未升级为int,然后将int分配给char,我们是否需要显式转换?

同样,我了解当你ch1 = 65时会发生什么。但由于Java不允许自动向下类型转换,我们是否需要从intchar进行显式转换?

2 个答案:

答案 0 :(得分:10)

因为Java Language Specification说:

  

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

     

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

所以你是正确的,因为表达式被提升为int,但因为它是一个常量表达式,所以不需要强制转换。如果它涉及变量(或其值不适合char),则会有所不同。

对于这类问题,最好立即查看语言规范,因为它是权威来源,对规范来说非常易读。

答案 1 :(得分:3)

我目前正在使用Eclipse。有两点需要注意:

  • 编译器在初始化期间检查边界。
  • 编译器计算常量表达式的值,例如3 * (2 + 1)

这有效:

byte b = 127; // works, range of a byte is [-128, 127]

但这不是:

byte b = 128; // does not work, outside of range

这有效:

byte b = 100 + -228; // works, 100 + -228 = -128

但这不是:

byte b = 1;
byte c = b + 1; // does not work, why not?

这也不是:

byte b = 1;
byte c = b + (byte) 1; // does not work, why not?

请注意b是一个变量表达式。如果涉及变量表达式,则运算符+的结果至少与int 一样大。因此,您无法将其分配给c。与常量表达式不同,编译器不计算变量表达式。

编译器会同样抱怨shortchar - 自己尝试一下。

最后,在变量上使用final有效地将其转换为常量表达式,因此这将起作用:

final byte b = 1;
byte c = b + 1; // works