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节)初始化,称为常量变量

bytechar的转换是扩展和缩小基元转换,如Java语言规范的第5.1.4节所述。

正如JLS所描述的那样,这是通过中间步骤完成的; 通过扩展的原语转换将byte转换为int ,然后通过缩小的原语转换将int转换为char (见5.1.3 )。

第5.2段解释了在执行任务时何时需要演员:

…如果表达式是byteshortcharint类型的常量表达式 (第15.28节 ):

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

您的变量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中显式完成。