2017-09-04 243 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