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

Java 为什么我可以在没有显式强制转换的情况下将int赋值给char变量?,java,casting,Java,Casting,我想知道为什么这个片段有效 char ch1; ch1 = 'a' + 1; System.out.println(ch1); 在第2行中,右侧不是提升为int,然后将int分配给char,我们不需要显式强制转换吗 同样,我理解当您执行ch1=65时会发生什么。但是由于Java不允许自动向下类型转换,我们不需要从int到char的显式转换吗?我现在正在使用Eclipse。有两件事需要注意: 编译器在初始化期间检查边界 编译器计算常量表达式的值,例如3*(2+1) 这项工作: byte b

我想知道为什么这个片段有效

char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);
在第2行中,右侧不是提升为
int
,然后将
int
分配给
char
,我们不需要显式强制转换吗


同样,我理解当您执行
ch1=65
时会发生什么。但是由于Java不允许自动向下类型转换,我们不需要从
int
char
的显式转换吗?

我现在正在使用Eclipse。有两件事需要注意:

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

byte b = 127; // works, range of a byte is [-128, 127]
byte b = 100 + -228; // works, 100 + -228 = -128
但这并不是:

byte b = 128; // does not work, outside of range
byte b = 1;
byte c = b + 1; // does not work, why not?
这项工作:

byte b = 127; // works, range of a byte is [-128, 127]
byte b = 100 + -228; // works, 100 + -228 = -128
但这并不是:

byte b = 128; // does not work, outside of range
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
。与常量表达式不同,编译器不计算变量表达式

编译器同样会抱怨
short
char
——自己试试看

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

final byte b = 1;
byte c = b + 1; // works
因为这本书说:

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

如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换

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


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

这是一个非常好的答案。谢谢我现在明白了。