为什么Long(Wrapper)没有被拆箱成原始long然后转换为原始字节?
Long lo = 4L;
byte b = (byte) lo; // c.ERR !!!
Byte bW = (byte) lo; // c.ERR !!!
答案 0 :(得分:4)
因为Java语言规范是这样说的!
投射上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大原始转换(第5.1.2节)
缩小基元转换(第5.1.3节)
扩大和缩小基元转换(第5.1.4节)
扩展引用转换(第5.1.5节),可选地后跟取消装箱转换(第5.1.8节)或未经检查的转换 (§5.1.9)
缩小引用转换(第5.1.6节),可选地后跟取消装箱转换(第5.1.8节)或未经检查的转换 (§5.1.9)
拳击转换(第5.1.7节),可选地后跟加宽引用转换(第5.1.5节)
取消装箱转换(第5.1.8节),可选地后跟扩展原始转换(第5.1.2节)。
在类型转换后应用值集转换(第5.1.13节)。
上面的列表不包含您在此处尝试执行的转化,这是一个拆箱转化(Long
到long
),然后是缩小转化(long
到{{ 1}})。有趣的是,如果你缩小然后拆箱,那就是允许的!
本节后面的表格也显示了这一点:
最后一行是byte
,不允许转换转化。
答案 1 :(得分:2)
Boxing / Unboxing是primitive / Wrapper之间的约定。它们不能完全互换。
来自AutoBoxing文档的一行可以立即回答。
Autoboxing是Java编译器在基元类型及其相应的对象包装类之间进行的自动转换。例如,将 int转换为Integer ,将 double转换为Double ,依此类推。如果转换采用另一种方式,则称为拆箱。
不是到处都是。例如:List<Integer>
是可能的,但List<int>
不是。所以每个功能都有它的范围。