您必须区分 赋值转换 和 方法调用转换 。
缩小原始转换
首先,请看JLS§5.1.3:
关于原始类型的22种特定转换称为“ 缩小原始转换” :
[…]
从int到byte,short或char
[…]
请注意,这仅说明了机制,但没有说明允许或不允许进行此类转换的地方。
作业转换
接下来,查看JLS§5.2:
[…]
另外,如果该表达式是字节,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型为byte,short或char,并且常量表达式的值可表示为变量的类型,则可以使用缩窄的原始转换。
[…]
这清楚地说明了在赋值中允许
byte b = 2从 int 类型到 byte 类型的变窄转换。
方法调用转换
但是,在阅读JLS§5.3时,您不会读到任何有关缩小转换的内容。因此,编译器正在做正确的工作。



