2017-09-04 301 views
2

说我有延伸AnyVal并使用Long内部的自定义类:专门收藏里面的AnyVal元素是否需要装箱?

case class Instruction(underlying: Long) extends AnyVal 

当我添加Instruction s到这是专门为Long集合,做了Instruction的需要拳击?

(是否有Scala集合而专门为Long?我需要一个索引序列。)

回答

4

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

其原因限制是保留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 _ => ... 
} 

专业化不会改变任何东西,任何集合(专业与否)可以通过在某处,它被看作是Coll[Any]Coll[T],其中有关确切的信息信息丢失。我想scala.collection.mutable.WrappedArray.ofLong是最接近这个的东西。它也有相应的生成器scala.collection.mutable.ArrayBuilder.ofLong

0

现在斯卡拉不支持@specialized收集

目前没有对专业化收藏的支持。如果我们能够在不影响大多数非专业化收藏的情况下做到这一点,那么在新设计中允许这样做会很好。

https://www.scala-lang.org/blog/2017/02/28/collections-rework.html

PS:我认为这是由的Java引起不支持原始采集,由于的Java generiction绑定到Object类型,但原始类型没有按来自Object