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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么将短变量赋值给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的文档

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

从类型布尔值到类型布尔值

从类型字节到类型字节

从短类型到短类型

从类型char到类型字符

从int类型到Integer类型

从类型long到类型Long

从类型float到类型Float

从double类型到Double类型

从null类型到null类型

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

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

另一答案

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

从类型布尔值到类型布尔值

从类型字节到类型字节

从短类型到短类型

从类型char到类型字符

从int类型到Integer类型

从类型long到类型Long

从类型float到类型Float

从double类型到Double类型

从null类型到null类型

参考:Conversions and Promotions Reference

另一答案

在考虑的代码中。

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

Integer扩展了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;
    }
}

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

另一答案

Java尝试执行自动扩展,然后自动装箱,然后自动向上播放,但不会为同一作业执行其中两个。对于方法参数赋值的相关情况,这解释并图示为here

以上是关于为什么将短变量赋值给Integer引用会产生编译时错误?的主要内容,如果未能解决你的问题,请参考以下文章

Integer对象能直接赋值给int吗?

小谈编译时类型与运行时类型

构造拷贝构造赋值析构

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?

请问这张C语言的PPT里面的短数据长变量的赋值我不懂,谁帮我看下?