包装类 - 为什么整数文字因Long而失败,但适用于任何较小的文本

Nei*_*ker 10 java autoboxing wrapper

只是想了解自动拳击,我做了一件事:

Short s = 250;
Long l = 250;
Run Code Online (Sandbox Code Playgroud)

分配Long l失败.我希望这是因为你不能加宽那个盒子(即它试图将int值加宽250到a long,然后将它打包,它不能这样做).

但是,作业的分配Short s.怎么回事呢?我的假设是它还在做拳击和某种转换.但是,如果它是一个知道250适合a的情况short,为什么它不知道250将适合一个long

axt*_*avt 12

通常,您不能在赋值中应用多个(隐式)转换(JLS§5.2赋值转换):

当表达式的值被赋值(第15.26节)给变量时,就会发生赋值转换:必须将表达式的类型转换为变量的类型.赋值上下文允许使用以下之一:

  • 身份转换(§5.1.1)
  • 扩展的原始转换(第5.1.2节)
  • 扩大参考转换(第5.1.5节)
  • 一个拳击转换(§5.1.7),可选地后跟一个加宽的引用转换
  • 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换.

Long l=250; 需要两次转换(扩展原始转换然后进行装箱转换),这就是它无法编译的原因.

Long l=250l; 编译,因为它需要一个拳击转换.

但缩小常量表达式的转换是一种特殊情况,这就是为什么Short s=250;编译:

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

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

  • 您好,这种情况的原因是我正在进行OCJP,考试的重点不是测试您的Java知识,而是测试您不需要的无关知识,以便您购买考官的书; ) (2认同)