Java 为什么将短变量赋值给整数引用会产生编译时错误?
我有以下Java代码:Java 为什么将短变量赋值给整数引用会产生编译时错误?,java,casting,type-conversion,boxing,Java,Casting,Type Conversion,Boxing,我有以下Java代码: class Boxing { public static void main(String args[]) { short s = 10; Integer iRef = s; } } 为什么它会在编译时产生错误?如果我在表达式中显式地将short类型转换为整数,它将成功编译。因为我在表达式中使用的short不是默认为整数的类型,而不需要显式大小写?装箱转换将基
class Boxing
{
public static void main(String args[])
{
short s = 10;
Integer iRef = s;
}
}
为什么它会在编译时产生错误?如果我在表达式中显式地将short类型转换为整数,它将成功编译。因为我在表达式中使用的short不是默认为整数的类型,而不需要显式大小写?装箱转换将基元类型的表达式转换为引用类型的相应表达式。具体而言,以下九种转换称为装箱转换: 从布尔类型到布尔类型 从类型字节到类型字节 从短型到短型 从类型char到类型char 从int类型到Integer类型 从long类型到long类型 从类型float到类型float 从double类型到double类型 从空类型到空类型
参考资料:您希望在这里发生两件事:加宽和自动装箱 不幸的是,Java只自动执行这两个操作中的一个。原因很可能是自动装箱引入得比较晚(在Java5中),他们必须小心不要破坏现有代码 你能行
int is = s; // widening
Short sRef = s; // autoboxing
Integer iRef = (int) s; // explicit widening, then autoboxing
这是我们的文件
装箱转换将基元类型的表达式转换为引用类型的相应表达式。具体而言,以下九种转换称为装箱转换: 从布尔类型到布尔类型 从类型字节到类型字节 从短型到短型 从类型char到类型char 从int类型到Integer类型 从long类型到long类型 从类型float到类型float 从double类型到double类型 从空类型到空类型 基本上,从
short
到Integer
的直接转换不是Java
自动装箱过程的一部分
如上所述,自动装箱只能将表示原语类型隐式转换为它表示的包装器类。由于情况并非如此,它将导致编译时错误。在所考虑的代码中
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;
}
}
它将在不产生任何错误的情况下运行。Java尝试执行自动加宽、自动装箱、自动向上投射,但不会对同一个赋值执行其中两个。对于方法参数赋值的相关案例,本文对此进行了解释并绘制了图表。我会做
int-iRef=s
。这不是我的问题。我的问题是为什么整数iRef=s不起作用。实际上,您可能想要int is=s&0xffff
用于加宽,因为在Java中通常使用short作为无符号16位整数(Java中除了char
之外没有无符号的short类型)。