为什么在自动装箱期间最终很长时间发生字节编译错误,但最终int到字节是否正常?

时间:2017-09-13 20:26:37

标签: java autoboxing

intshort类型的常量自动装箱到Byte期间没有错误,但long类型的常量确实有错误。为什么呢?

final int i = 3;
Byte b = i; // no error

final short s = 3;
Byte b = s; // no error


final long l = 3;
Byte b = l; // error

1 个答案:

答案 0 :(得分:16)

来自JLS Sec 5.2, "Assignment contexts"(强调我的):

  

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

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

    ,则可以使用缩小的基元转换,然后进行装箱转换。      
        
    • 字节和常量表达式的值可以在字节类型中表示。
    •   
    • ...
    •   
  •   

规范{}不允许long s。

请注意,此处的第二个要点是,无论装箱如何都会发生这种情况:为long变量分配常量byte表达式同样会失败:

// Both compiler errors.
byte primitive = 0L;
Byte wrapped = 0L;