3 回答
![?](http://img1.sycdn.imooc.com/54584f9d0001219b02200220-100-100.jpg)
TA贡献1804条经验 获得超8个赞
您的问题可以归结为:
为什么分配15
到byte
的变量声明的作品:
byte b = 15;
但是在调用方法时不是吗?
subtractNumbers(15,16,17);
这是因为这两种情况处于两种不同的上下文中。第一个在分配上下文中,而第二个在调用上下文中。
根据JLS§5.2分配上下文,
分配上下文允许使用以下之一:
...
此外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):
如果变量的类型为byte,short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄的原始转换。
15
当然是一个常数表达式,因此允许从int
到的原始转换范围越来越窄byte
。
但是,在调用上下文中,情况并非如此:
JLS§5.3调用上下文
严格的调用上下文允许使用以下之一:
身份转换(第5.1.1节)
不断扩大的原始转换(第5.1.2节)
扩展的参考转换(第5.1.5节)
松散的调用上下文允许进行更多的转换,因为只有在使用严格的调用上下文找不到合适的声明的情况下,它们才用于特定的调用。松散的调用上下文允许使用以下之一:
身份转换(第5.1.1节)
不断扩大的原始转换(第5.1.2节)
扩展的参考转换(第5.1.5节)
装箱转换(第5.1.7节)(可选),然后加宽参考转换
拆箱转换(第5.1.8节)(可选),然后进行扩大的原始转换
没有提到“缩小原始转换”,因此在调用上下文中是不允许的。
![?](http://img1.sycdn.imooc.com/54584f6d0001759002200220-100-100.jpg)
TA贡献1815条经验 获得超13个赞
原因是因为当您尝试将int
to转换为to时byte
,您正在执行缩小的原始转换。由于这可能会导致信息丢失,因此编译器要求您进行显式强制转换(即,就像您byte
在两种情况下显式强制转换为15类型时所做的一样)。
要回答另一个问题,为什么您可以简单地声明byte c = 15
而没有编译错误,这是因为15
仍在byte
允许的-128到-127范围内。如果您尝试分配一个较大的值(例如)byte d = 128
,则仍然会遇到编译时错误。
添加回答
举报