何时扩展AnyVal的类没有取消装箱?

时间:2016-11-08 13:22:54

标签: scala

https://stackoverflow.com/a/40486805/4533188中,我被告知扩展AnyVal的类不能被编译器解包(在某些情况下,JVM字节码中只有底层原语)。取消装箱不起作用的所有规则是什么?

我理解如果将一个扩展AnyVal的类放入一个集合中,那么取消装箱就不起作用了。我也得到了一个关于泛型的例子,但我想了解整个图片。

1 个答案:

答案 0 :(得分:2)

The documentation is pretty clear on these occasions

  

分配摘要

     

在以下情况下实际实例化值类:

     
      
  • 将值类视为另一种类型。
  •   
  • 分配了一个值类   数组。
  •   
  • 进行运行时类型测试,例如模式匹配。
  •   

值类的示例被视为另一种类型:

trait Distance extends Any
case class Meter(val value: Double) extends AnyVal with Distance

def add(a: Distance, b: Distance): Distance = ???
add(Meter(3.4), Meter(4.3))

分配给数组的值类的示例:

val arrayOfMeter: Array[Meter] = ???

模式匹配示例:

val p: Meter = new Meter(1.0)
p match {
  // ...
}