为什么在自动装箱期间最终的字节变量无法转换为Integer?

时间:2017-09-13 21:46:24

标签: java type-conversion autoboxing

当我尝试将i2自动装箱到Byte时没有错误,但是当我反之亦然(b1Integer)时,则会发生错误。

        final byte b1 = 1;
        Integer i1 = b1; //error

        final int i2 = 1;
        Byte b2 = i2;// no error

        byte b3 = 1;
        int i3 = b3; // no error

1 个答案:

答案 0 :(得分:1)

我是否可以建议您阅读我在JLS Sec 5.2的答案中链接的previous similar question

  

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

     
      
  • 身份转换(第5.1.1节)

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

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

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

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

  •   
     

...

     

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

     
      
  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
  •   
  • 如果变量的类型为:

    ,则可以使用缩小的基元转换,然后进行装箱转换。      
        
    • 字节和常量表达式的值可以在字节类型中表示。
    •   
    • ...
    •   
  •   

以相反的顺序处理您的案件:

    byte b3 = 1;
    int i3 = b3; // no error

byte分配给int只是一种扩大的转化。

    final int i2 = 1;
    Byte b2 = i2;// no error

这与您之前的问题完全相同:如果int的值适合Byte,您可以为int分配一个不变值的byte }。

    final byte b1 = 1;
    Integer i1 = b1; //error

您正在尝试进行扩展原语转换,然后进行装箱转换。这不是这里列出的案例之一,所以这是一个错误。

您可以使用明确的扩展演员来解决此问题:

    Integer i1 = (int) b1; //ok
相关问题