当我尝试将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
答案 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