说我有延伸AnyVal
并使用Long
内部的自定义类:专门收藏里面的AnyVal元素是否需要装箱?
case class Instruction(underlying: Long) extends AnyVal
当我添加Instruction
s到这是专门为Long
集合,做了Instruction
的需要拳击?
(是否有Scala集合而专门为Long
?我需要一个索引序列。)
说我有延伸AnyVal
并使用Long
内部的自定义类:专门收藏里面的AnyVal元素是否需要装箱?
case class Instruction(underlying: Long) extends AnyVal
当我添加Instruction
s到这是专门为Long
集合,做了Instruction
的需要拳击?
(是否有Scala集合而专门为Long
?我需要一个索引序列。)
是的,它会被装箱。不幸的是,价值类在用作类型参数(泛型)或放入集合时失去了所有的好处。他们盒装总是当他们需要被看作是任何其他类型正好价值类本身的类型。
其原因限制是保留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
。
现在斯卡拉不支持@specialized
为收集。
目前没有对专业化收藏的支持。如果我们能够在不影响大多数非专业化收藏的情况下做到这一点,那么在新设计中允许这样做会很好。
https://www.scala-lang.org/blog/2017/02/28/collections-rework.html
PS:我认为这是由的Java引起不支持原始采集,由于的Java generiction绑定到Object
类型,但原始类型没有按来自Object
。