促进原始类型

Nur*_*tcu 4 java primitive types casting wrapper

我有一个关于在Java中推广原始类型的问题.正如我们在下面的示例中所看到的,由于类型不匹配的错误,其中一个方法无法编译.每个方法返回相同的值但是使用不同的类型.

long当包装类的版本Long失败时,原始方法的版本可以正常工作.这是因为语句中的int文字return将首先提升为更宽的基本类型(例如long),然后提升到相应的包装类Integer等等.由于Integer不是Long编译器的子类会产生错误.

但是为什么包装类的版本Byte没有任何错误?编译器究竟做了什么?

long getPrimitiveLong() {
    return 12; // valid
}

Long getWrapperLong() {
    return 12; // Error: type mismatch
}

Byte getWrapperByte() {
    return 12; // valid
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

该版本Byte通过一些编译魔术工作.

long可以用L后缀构造的数字文字不同,例如12L,没有byte文字这样的东西.这就是Java编译器将符合字节的数字文字视为byte文字的原因.因此,12在您的上一个示例中,它被视为类型的常量byte.

Java语言规范在5.2节中提供了对此转换的描述:

如果变量的类型是:则可以使用缩小的基元转换,然后进行装箱转换:

  • Byte并且常量表达式的值可在类型中表示byte.
  • Short并且常量表达式的值可在类型中表示short.
  • Character并且常量表达式的值可在类型中表示char.