为什么将短变量赋值给Integer引用会产生编译时错误?

时间:2015-11-23 09:59:30

标签: java casting type-conversion boxing

我在Java中有以下代码:

class Boxing
    {
        public static void main(String args[])
        {
            short s = 10;
            Integer iRef = s;
        }
    }

为什么在编译时会产生错误?如果我明确地将short缩写为表达式中的整数,则会成功编译。因为我在表达式中使用short不是默认情况下应该是整数的类型而不需要显式的大小写?

4 个答案:

答案 0 :(得分:13)

你想在这里发生两件事:加宽和自动装箱。

不幸的是,Java只会自动执行两者中的一个。其原因很可能是相当晚推出了自动装箱(在Java5中),他们必须小心不要破坏现有的代码。

你可以做到

int is = s;    // widening

Short sRef = s;   // autoboxing

Integer iRef = (int) s;  // explicit widening, then autoboxing

答案 1 :(得分:1)

拳击转换将基本类型的表达式转换为引用类型的相应表达式。具体来说,以下九个转换称为装箱转换:

  

从类型布尔值到类型布尔

     

从类型字节到类型字节

     

从短类型到短类型

     

从char类型到Character

     

从int类型到Integer类型

     

从long类型到Long

     

从float类型到Float类型

     

从double类型到Double

     

从null类型到null类型

参考:Conversions and Promotions Reference

答案 2 :(得分:1)

以下是JLS 5.1.7

的文档
  

拳击转换将基本类型的表达式转换为引用类型的相应表达式。具体来说,以下九个转换称为装箱转换:

     

从类型布尔值到类型布尔

     

从类型字节到类型字节

     

从短类型到短类型

     

从char类型到Character

     

从int类型到Integer类型

     

从long类型到Long

     

从float类型到Float类型

     

从double类型到Double

     

从null类型到null类型

基本上,从shortInteger的直接转换不属于Java的自动装箱过程。

如上所述,自动装箱只能将表示基元类型隐含地表示为表示Wrapper类。由于情况并非如此,因此会导致编译时错误。

答案 3 :(得分:0)

Java尝试执行自动加宽,然后自动装箱,然后自动向上投射,但是对于同一分配,将不会执行其中的两个操作。对于方法参数分配的相关情况,对此进行了here的解释和图示。