Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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_Type Conversion - Fatal编程技术网

Java:加宽和自动装箱转换问题

Java:加宽和自动装箱转换问题,java,type-conversion,Java,Type Conversion,我不明白为什么java不进行加宽和自动装箱 Integer i = (short) 10; 我认为会发生以下情况: 首先将转换范围从10缩小到short short然后会扩展到int int将自动装箱到Integer 相反,这是一个编译错误 例2: 短x=10 整数y=x 这也失败了。这里发生的是从int到short的强制转换,然后尝试从short到Integer的赋值转换 赋值转换()允许先装箱再加宽,但不允许先加宽再装箱 分配上下文允许使用以下内容之一: 身份转换(§5.1.1) 扩大原

我不明白为什么java不进行加宽和自动装箱

Integer i = (short) 10;
我认为会发生以下情况:

  • 首先将转换范围从
    10
    缩小到
    short
  • short
    然后会扩展到
    int
  • int
    将自动装箱到
    Integer
  • 相反,这是一个编译错误

    例2:

    短x=10
    整数y=x


    这也失败了。

    这里发生的是从
    int
    short
    的强制转换,然后尝试从
    short
    Integer
    的赋值转换

    赋值转换()允许先装箱再加宽,但不允许先加宽再装箱

    分配上下文允许使用以下内容之一:

    • 身份转换(§5.1.1)

    • 扩大原语转换(§5.1.2)

    • 拓宽参考转换(§5.1.5)

    • 装箱转换(§5.1.7)后可选加宽 参考转换

    • 拆箱转换(§5.1.8)后可选加宽 原语转换

    根据处理赋值转换的:

    Integer i = (int) (short) 10;
    
    分配上下文允许使用以下内容之一:

    • 身份转换(§5.1.1)

    • 扩大原语转换(§5.1.2)

    • 拓宽参考转换(§5.1.5)

    • 装箱转换(§5.1.7)后可选加宽 参考转换

    • 拆箱转换(§5.1.8)后可选加宽 原语转换

    无法同时应用两种转换(加宽原语转换和装箱转换);这里只能应用一个转换,因此必须导致错误

    解决方案是将
    short
    转换回
    int
    (转换转换),这将允许分配转换为装箱转换:

    Integer i = (int) (short) 10;
    
    (或者在这里,首先不要将其转换为
    short


    在java中,它遵循“自动装箱,然后加宽”的顺序,不管您是否这样做 这: int x=5; 对象obj=x

    或 这:

    int x=5; 长l=x

    仅当存在is-a关系时才会加宽。

    所以,当应用上述序列时,第一种情况对编译器非常有效,因为int将是autobox到Integer,然后分配给Object,即加宽(即autobox先加宽,然后加宽),处于is-A关系中。但在第二种情况下,如果int x是autbox to Integer,则不允许将其赋值为Long,因为它不是一种关系,因此会引发编译错误。

    可以在自动装箱和加宽方面使用重载来模拟类似的用例

    public static void m(short s) {
        System.out.println("widening");
      }
    
    public static void m(Integer i) {
        System.out.println("Autoboxing");
    }
    
    public static void main(String[] args) {
        short x = 10;
        m(x);
    }
    
    输出:加宽


    因此,在nut shell中,我们可以说,加宽在基于JLS 5.1.5的java中占主导地位,为什么我的示例2失败了?在处理诸如
    Short
    Integer
    等包装器对象时,重要的是要认识到
    Short
    不是
    Integer
    ;一个不是另一个的子类。您在此处引用的转换(加宽引用转换)在此处不适用。哦,是的。我现在想起来了。扩展引用转换涉及子类——换句话说,是相关的类。为什么不先把int改为short,再改为int,然后只改为Integer?不够聪明OP@yapkm01并不是JVM不够智能,而是它根本不被允许
    short
    to
    int
    是一种扩展的原语转换,
    int
    to
    Integer
    是一种装箱转换。赋值转换只能执行这两个操作中的一个,不能同时执行这两个操作。