Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么将短变量赋值给整数引用会产生编译时错误?_Java_Casting_Type Conversion_Boxing - Fatal编程技术网

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不是默认为整数的类型,而不需要显式大小写?装箱转换将基

我有以下Java代码:

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类型)。