Oui, ce sera en boîte. Malheureusement, les classes de valeur perdent tous leurs avantages lorsqu'elles sont utilisées comme arguments de type (génériques) ou mises dans des collections. Ils sont encadrés toujours quand ils doivent être vus comme tout autre type que exactement le type de la classe de valeur elle-même.
La raison de cette limitation est que, pour garder la sémantique du langage Scala son code comme celui-ci doit travailler:
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 _ => ...
}
La spécialisation ne change rien ici, une collection (spécialisée ou non) pourrait être passé quelque part où il est considéré comme Coll[Any]
ou Coll[T]
où les informations sur exact type d'élément est perdu.
Si vous voulez un IndexedSeq[Long]
avec un stockage unboxed, je pense que scala.collection.mutable.WrappedArray.ofLong
est la chose la plus proche de cela. Il a également son constructeur correspondant, scala.collection.mutable.ArrayBuilder.ofLong
.