我在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
从空类型到空类型
基本上,从short
到Integer
的直接转换不是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尝试执行自动加宽、自动装箱和自动上广播,但不会为同一赋值执行其中两个操作。对于方法参数分配的相关情况,这里将对此进行解释和图示。