【问题标题】:Why does the assignment of a short variable to an Integer reference produce a compile time error?为什么将短变量分配给 Integer 引用会产生编译时错误?
【发布时间】:2023-03-21 01:36:01
【问题描述】:

我在 Java 中有以下代码:

class Boxing
    {
        public static void main(String args[])
        {
            short s = 10;
            Integer iRef = s;
        }
    }

为什么会在编译时产生错误?如果我在表达式中显式地将 short 类型转换为整数,则它编译成功。由于我在表达式中使用了 short 类型,因此默认情况下应该是整数而不需要显式大小写?

【问题讨论】:

  • 我愿意int iRef = s
  • 这不是我的问题。我的问题是为什么 Integer iRef = s 不起作用。

标签: java casting type-conversion boxing


【解决方案1】:

您希望在这里发生两件事:加宽和自动装箱。

不幸的是,Java 只能自动执行这两者之一。其原因很可能是自动装箱是在相当晚的时候引入的(在 Java5 中),他们必须小心不要破坏现有代码。

你可以的

int is = s;    // widening

Short sRef = s;   // autoboxing

Integer iRef = (int) s;  // explicit widening, then autoboxing

【讨论】:

  • 您实际上可能希望 int is = s & 0xffff; 扩大范围,因为在 Java 中通常将 short 用作无符号 16 位整数(Java 中除了 char 之外没有无符号 short 类型)。跨度>
【解决方案2】:

这是来自JLS 5.1.7的文档

装箱转换将原始类型的表达式转换为相应的引用类型的表达式。具体来说,以下九种转换称为拳击转换:

从布尔型到布尔型

从字节类型到字节类型

从短型到短型

从char类型到Character类型

从 int 类型到 Integer 类型

从长型到长型

从浮点型到浮点型

从双精度型到双精度型

从空类型到空类型

基本上从shortInteger 的直接转换不是Java 自动装箱过程的一部分。

如上所述,自动装箱只能将表示的原始类型隐式转换为表示的 Wrapper 类。由于不是这种情况,因此会导致编译时错误。

【讨论】:

    【解决方案3】:

    装箱转换将原始类型的表达式转换为相应的引用类型的表达式。具体来说,以下九种转换称为拳击转换:

    从布尔型到布尔型

    从字节类型到字节类型

    从短型到短型

    从char类型到Character类型

    从 int 类型到 Integer 类型

    从长型到长型

    从浮点型到浮点型

    从双精度型到双精度型

    从空类型到空类型

    参考:Conversions and Promotions Reference

    【讨论】:

      【解决方案4】:

      在所考虑的代码中。

      class Boxing
      {
          public static void main(String args[])
          {
              short s = 10;
              Integer iRef = s;
          }
      }
      

      整数扩展 java.lang.Number。并且 java.lang.Short 还扩展了 java.lang.Number。但是 Short 和 Integer 没有直接关系,如果你想你可以运行下面的程序。

      class Boxing
      {
          public static void main(String args[])
          {
              short s = 10;
              Number iRef = s;
          }
      }
      

      它将运行而不会产生任何错误。

      【讨论】:

        【解决方案5】:

        Java 尝试执行自动扩展,然后自动装箱,然后自动向上转换,但不会对同一分配执行其中的两个。这在here进行了解释和图解,用于方法参数分配的相关案例。

        【讨论】:

          猜你喜欢
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          • 2023-03-22
          • 2012-01-03
          • 1970-01-01
          相关资源
          最近更新 更多