2017-09-04 11 views

Répondre

4

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.

0

Pour l'instant Scala ne supporte pas @specialized pour collection.

Actuellement, il n'y a pas de support pour la spécialisation des collections. Il serait bon de le permettre dans le nouveau design si nous pouvons le faire sans trop d'impact sur la majorité des collections non spécialisées.

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

PS: Je pense que cela est causé par la Java ne supporte pas collection primitive, Java Depuis generiction est lié au type Object, mais type primitif doesn Dérivé de Object.