2017-09-13 253 views
-2

当我尝试使用autobox i2Byte时没有错误,但是当我做反之亦然时(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 
+0

我觉得解释是[这个答案](https://stackoverflow.com/a/45105159/905488)。我不明白变量是“最终”如何有所作为。 –

+0

@MickMnemonic'final'在第二个例子中很重要,因为它使'i2'成为一个常量表达式。 – Radiodef

+0

@Radiodef,但OP特别询问第一次转换,其中'final'是无关紧要的。 –

回答

1

我可以建议你阅读JLS Sec 5.2,我在我的答案链接到您的previous similar question

分配上下文允许使用以下中的一种:

  • 的标识转换(§5.1.1)

  • 加宽原语转换(§5.1.2)

  • 扩大参考转换(§5.1.5)

  • a boxi ng转换(§5.1.7)可选地接着加宽 参考转换

  • 开箱转换(§5.1.8)可选地接着加宽 原始转换。

...

此外,如果表达式的类型是字节,短,炭,的常量表达式(§15.28)或INT:

  • 甲基本收缩转换可以如果变量的类型是byte,short或char,并且常量表达式的值可以用变量的类型表示,则可以使用它。

    • 字节和常量表达式的值是在类型字节可表示:
    • 甲基本收缩转换接着装箱转换如果变量的类型是可以被使用。

    • ...

以你的情况下,以相反的顺序:

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

分配一个byteint仅仅是一个扩大转换。

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

这是完全一样的你前面的问题:你可以指定一个恒定值intByte,只要int的价值融入一个byte

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

你试图做一个扩大原语转换,随后装箱转换。这不是这里列出的情况之一,所以这是一个错误。

您可以用明确拓宽投解决这个问题:

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