为什么Long(Wrapper)在转换为byte时没有被拆箱成原始长?

时间:2018-03-23 07:13:40

标签: java casting

为什么Long(Wrapper)没有被拆箱成原始long然后转换为原始字节?

Long lo = 4L;

byte b = (byte) lo;     // c.ERR !!!

Byte bW = (byte) lo;    // c.ERR !!!

2 个答案:

答案 0 :(得分:4)

因为Java语言规范是这样说的!

JLS § 5.5 Casting Contexts

  

投射上下文允许使用以下之一:

     
      
  • 身份转换(第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节)。

  •   

上面的列表不包含您在此处尝试执行的转化,这是一个拆箱转化(Longlong),然后是缩小转化(long到{{ 1}})。有趣的是,如果你缩小然后拆箱,那就是允许的!

本节后面的表格也显示了这一点:

enter image description here

最后一行是byte,不允许转换转化。

答案 1 :(得分:2)

Boxing / Unboxing是primitive / Wrapper之间的约定。它们不能完全互换。

来自AutoBoxing文档的一行可以立即回答。

  

Autoboxing是Java编译器在基元类型及其相应的对象包装类之间进行的自动转换。例如,将 int转换为Integer ,将 double转换为Double ,依此类推。如果转换采用另一种方式,则称为拆箱。

不是到处都是。例如:List<Integer>是可能的,但List<int>不是。所以每个功能都有它的范围。