Java:扩展和自动装箱转换问题

时间:2013-07-29 23:28:31

标签: java type-conversion

我不明白为什么java不进行扩展然后自动装箱。

Integer i = (short) 10;

我认为会发生以下情况:

  1. 首先将转化范围从10缩小为short
  2. 然后
  3. short将扩展为int
  4. int然后会自动停靠到Integer
  5. 相反,这是编译错误。

    示例2:

    短x = 10;
    整数y = x;

    这也失败了。

4 个答案:

答案 0 :(得分:3)

这里发生的是从intshort的转换转换,然后尝试从short转换为Integer

分配转换(§5.2)允许拳击然后加宽,但不能加宽然后拳击。

  

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

     
      
  • 身份转换(第5.1.1节)

  •   
  • 扩大原始转换(第5.1.2节)

  •   
  • 扩大参考转换(第5.1.5节)

  •   
  • 拳击转换(§5.1.7),可选地后跟加宽   参考转换

  •   
  • 取消装箱转换(第5.1.8节),可选地后跟加宽   原始转换。

  •   

答案 1 :(得分:3)

根据JLS, Section 5.2处理作业转换

  

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

     
      
  • 身份转换(第5.1.1节)

  •   
  • 扩大原始转换(第5.1.2节)

  •   
  • 扩大参考转换(第5.1.5节)

  •   
  • 拳击转换(§5.1.7),可选地后跟加宽   参考转换

  •   
  • 取消装箱转换(第5.1.8节),可选地后跟加宽   原始转换。

  •   

无法一次应用两次转换(扩大原始转换和装箱转换);这里只能应用一次转换,因此必须导致错误。

解决方案是将short强制转换为int(转换转换),这样可以将赋值转换为装箱转换:

Integer i = (int) (short) 10;

(或者在这里,首先不要把它投到short。)

Integer i = 10;

答案 2 :(得分:0)

在java中,无论你是否正在做,它都会将序列作为“autoBoxing然后加宽” 这个 : int x = 5; 对象obj = x;

或者 这样:

int x = 5; 长l = x;

只有在存在is-a关系时才会发生扩展 因此,在应用上述序列时,第一种情况对于编译器非常有效,因为int将是autobox到Integer然后分配给Object,即加宽(即首先是autobox然后加宽),处于Is-A关系。但在第二种情况下,如果int x是autbox到Integer并且赋值为Long则不允许,不是is-a关系,因此会引发编译错误。

答案 3 :(得分:0)

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

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);
}

输出:扩展

因此,在坚果壳中,我们可以说,在Java中,自动安装占主导地位