为什么将短变量赋值给Integer引用会产生编译时错误



我在Java中有以下代码:

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

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

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

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

你可以做

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

这是JLS 5.1.7 的文档

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

从类型boolean到类型boolean

从类型字节到类型字节

从类型短路到类型短路

从类型char到类型Character

从类型int到类型Integer

从长型到长型

从类型float到类型float

从类型double到类型double

从空类型到空类型

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

如上所述,自动装箱只能将表示基元类型隐式转换为其表示的Wrapper类。由于情况并非如此,它将导致编译时错误。

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

从类型boolean到类型boolean

从类型字节到类型字节

从类型短路到类型短路

从类型char到类型Character

从类型int到类型Integer

从长型到长型

从类型float到类型float

从类型double到类型double

从空类型到空类型

参考:转换和促销参考

在考虑的代码中。

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

Integer扩展了java.lang.Number。java.lang.Short也扩展了java.ang.Number,但Short和Integer没有直接关系,如果你想的话,你可以运行下面的程序。

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

它将在不产生任何错误的情况下运行。

Java尝试执行自动加宽、自动装箱和自动上广播,但不会为同一赋值执行其中两个操作。对于方法参数分配的相关情况,这里将对此进行解释和图示。

最新更新