将int
和short
类型的常量自动装箱到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
答案 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;