为什么在自动装箱期间会发生最终长到字节编译错误,但最终整数到字节是可以的?

2022-09-03 14:33:08

在自动装箱常量和类型 to 期间没有错误,但带有类型 do 的常量有错误。为什么?intshortBytelong

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

来自JLS Sec 5.2,“Assignment Contexts”(强调我的):

此外,如果表达式是字节、短整型、字符或整型的常量表达式 (§15.28)::

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

  • 如果变量的类型为:

    • 字节和常量表达式的值可在类型字节中表示。
    • ...

规范根本不允许它。long

请注意,这里的第二个项目符号点说,无论装箱如何,都会发生这种情况:将常量表达式分配给变量同样会失败:longbyte

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

答案 2

推荐