Java char到字节转换

时间:2015-05-20 10:09:04

标签: java scjp

我一直在测试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
    }
}

有人解释为什么当我在字节中添加最后一个时它能正常工作吗?

3 个答案:

答案 0 :(得分:19)

当变量为final时,编译器会自动内联其值为1.此值可表示为char,即:

c = b1;

相当于

c = 1;

事实上,根据this section on final variablesb1被视为常数:

  

基本类型或类型String的变量,即final,并使用编译时常量表达式(第15.28节)初始化,称为常量变量

答案 1 :(得分:10)

bytechar的转换是一种扩展和缩小的原始转换,如Java语言规范的paragraph 5.1.4中所述。

正如JLS所描述的,这是通过中间步骤完成的; byte通过扩展原语转换转换为int,然后int通过缩小原语转换转换为char。(请参阅5.1.3)。< / p>

Paragraph 5.2说明在执行作业时何时需要演员:

  

...如果表达式是{strong} byteshortchar或{{ 1}}:

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

您的变量char确实是常量,但您的变量b1不是,因此此规则适用于b2,但不适用于b1

所以:您可以将b2分配给b1,因为c是一个常量,而常量b1的值适合1,但是如果没有强制转换,您就无法将char分配给b2,因为c不是常量。

答案 2 :(得分:0)

好吧,因为byte是签名类型而char不是,所以你需要为(2)

应用显式类型转换
c = (char)b2;

最终声明也适用于1,因为在编译之前,编译器能够确认没有因转换而丢失,因为'1'在char范围内,尝试将'-1'放在同一个final中(1)中的陈述您将再次收到编译错误。

所有这些归结为有符号和无符号类型之间的类型兼容性......这需要在java中明确地完成。