专门的集合中的AnyVal元素需要装箱吗?

fre*_*low 2 collections autoboxing scala value-type long-integer

假设我有一个扩展AnyVal并在Long内部使用的自定义类:

case class Instruction(underlying: Long) extends AnyVal
Run Code Online (Sandbox Code Playgroud)

当我添加Instructions到这是专门为一个集合Long,执行Instruction的需要拳击?

(Scala集合是否专门用于Long?我需要一个索引序列.)

ghi*_*hik 5

是的,它将被装箱.不幸的是,当用作类型参数(泛型)或放入集合时,值类会失去所有的好处.他们盒装总是当他们需要被看作是任何其他类型的比恰好值类本身的类型.

这种限制的原因是为了保留Scala语言的声音语义,这样的代码必须工作:

case class ValueClass(raw: Long) extends AnyVal
val someList: List[Any] = List[ValueClass](ValueClass(42L))
someList.head match {
  case ValueClass(raw) => // boxing needed for this match to work...
  case _ => ...
}
Run Code Online (Sandbox Code Playgroud)

专业化在这里不会改变任何东西,任何集合(专门的或不专用的)都可以被传递到它所看到的地方Coll[Any]或者Coll[T]有关精确元素类型的信息丢失的地方.

如果你想要一个IndexedSeq[Long]带有未装箱的存储空间,我认为scala.collection.mutable.WrappedArray.ofLong是最接近它的.它也有相应的构建者,scala.collection.mutable.ArrayBuilder.ofLong.