Java char到字节转换
我一直在测试char铸件,我经历了这个:
public class Test { public static void main(String a[]) { final byte b1 = 1; byte b2 = 1; char c = 2; c = b1; // 1- Working fine c = b2; // 2 -Compilation error } }
任何人都可以解释为什么当我在字节中添加最后一个时它在1中正常工作?
当变量为final
,编译器会自动内联其值为1.此值可表示为char
,即:
c = b1;
相当于
c = 1;
实际上,根据final
变量的这一部分 , b1
被视为常量:
原始类型或类型
String
变量是final
并使用编译时常量表达式(第15.28节)初始化,称为常量变量 。
从byte
到char
的转换是扩展和缩小基元转换,如Java语言规范的第5.1.4节所述。
正如JLS所描述的那样,这是通过中间步骤完成的; 通过扩展的原语转换将byte
转换为int
,然后通过缩小的原语转换将int
转换为char
(见5.1.3 )。
第5.2段解释了在执行任务时何时需要演员:
…如果表达式是
byte
,short
,char
或int
类型的常量表达式 (第15.28节 ):
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
您的变量b1
确实是常量,但您的变量b2
不是,因此此规则适用于b1
但不适用于b2
。
所以:你可以将b1
分配给c
因为b1
是常量,常量的值1
适合char
,但是你不能在没有b2
转换的情况下将b2
赋值给c
,因为b2
不是常量。
好吧,因为byte是签名类型而char不是,所以你需要为(2)应用显式类型转换
c = (char)b2;
最终的声明也适用于1,因为在编译之前,编译器能够确认没有因转换而丢失,因为’1’在char的范围内,尝试将’-1’与相同的最终语句放在一起( 1)您将再次收到编译错误。
所有这些归结为有符号和无符号类型之间的类型兼容性……这需要在java中显式完成。