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

Наз*_*лян 15 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
Run Code Online (Sandbox Code Playgroud)

And*_*ner 16

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

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

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

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

long根据规范,它根本不允许使用.

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

// Both compiler errors.
byte primitive = 0L;
Byte wrapped = 0L;
Run Code Online (Sandbox Code Playgroud)

  • 可能主要是因为`int`是常量值的默认类型,包括表达式,因此会有一个_lot_代码,如`short s = 123`,如果没有使用这种缩小转换,你需要在任何地方进行转换.特别是,Java没有关于类型更窄的文字的语法.另一方面,如果表达式的类型显式为"long",因为`L`已用于常量或某些部分是常量,那么缩小它可能是一个错误,这种情况不太常见比`int`的情况,我想平衡有利于使它成为一个错误. (6认同)
  • @MickMnemonic相同的参数不适用于`int`,但是:它可以表示该范围之外的值.如果常量值在`byte`表示的范围内,编译器只允许它为`int`.没有(明显的)理由你不能用`long`做同样的事情. (2认同)