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
,这是正确的,但是因为它是一个常量表达式,所以不需要强制转换。如果它涉及一个变量(或者它的值不适合字符
),则会有所不同
对于这类问题,最好立即查看语言规范,因为它是权威的源代码,对于规范来说非常可读。这是一个非常好的答案。谢谢我现在明白了。