为什么在自动装箱期间最终字节变量不能转换为整数?
问题描述:
当我尝试使用autobox i2
到Byte
时没有错误,但是当我做反之亦然时(b1
到Integer
),则会发生错误。为什么在自动装箱期间最终字节变量不能转换为整数?
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
答
我可以建议你阅读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
分配一个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
我觉得解释是[这个答案](https://stackoverflow.com/a/45105159/905488)。我不明白变量是“最终”如何有所作为。 –
@MickMnemonic'final'在第二个例子中很重要,因为它使'i2'成为一个常量表达式。 – Radiodef
@Radiodef,但OP特别询问第一次转换,其中'final'是无关紧要的。 –