只是想了解自动拳击,我做了一件事:
Short s = 250;
Long l = 250;
Long l
的分配失败。我希望这是因为你不能加宽那个盒子(即它试图将int
值250
加宽到long
,然后将它打包成它不能做的事。)
但是,对Short s
的分配有效。怎么回事呢?我的假设是它还在做拳击和某种转换。但如果知道250
符合short
的情况,为什么它不知道250
会适合long
?
答案 0 :(得分:12)
通常情况下,您无法在作业中应用多个(隐式)转化(JLS §5.2 Assignment Conversion):
当表达式的值被赋值(第15.26节)给变量时,就会发生赋值转换:必须将表达式的类型转换为变量的类型。分配上下文允许使用以下之一:
- 身份转换(第5.1.1节)
- 扩大原始转换(第5.1.2节)
- 扩大参考转换(第5.1.5节)
- 拳击转换(第5.1.7节),可选地后跟加宽引用转换
- 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换。
Long l=250;
需要两次转换(扩展原始转换,然后进行装箱转换),这就是它无法编译的原因。
Long l=250l;
编译,因为它需要一次拳击转换。
但缩小常量表达式的转换是一种特殊情况,这就是Short s=250;
编译的原因:
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
- 如果变量的类型是:则可以使用缩小的基元转换,然后使用装箱转换:
- 字节和常量表达式的值可以在字节类型中表示。
- 简短,常量表达式的值可在short类型中表示。
- 字符和常量表达式的值可在char。
类型中表示
答案 1 :(得分:0)
理想情况下,不应允许自动缩小。
但由于没有字节/短文字,我们无法写
byte b = 0b;
对
来说似乎很愚蠢byte b = (byte)0;
允许自动缩小常量整数,以便我们编写
byte b = 0;
转移到自动装箱。
对于long / Long,因为有很长的文字,所以这不是一个问题。不过,应该允许它,因为自动加宽有符号整数总是安全的。