为什么将短变量赋值给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类型
基本上,从short
到Integer
的直接转换不是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变量时会抛出空指针异常?