Cette réponse utilise l' Manifest
-API, qui est obsolète depuis la Scala 2.10. Veuillez voir les réponses ci-dessous pour plus de solutions actuelles.
Scala a été définie avec le Type d'Effacement, parce que la Machine Virtuelle Java (JVM), contrairement à Java, n'a pas de génériques. Cela signifie que, au moment de l'exécution, seule la classe existe, non pas de ses paramètres de type. Dans l'exemple, la JVM sait que c'est de la manipulation d'un scala.collection.immutable.List
, mais pas que cette liste est paramétrable avec des Int
.
Heureusement, il y a une option dans Scala qui vous permet de contourner cela. C'est le Manifeste. Un Manifeste est de classe dont les instances sont des objets représentant des types. Depuis ces instances sont des objets, vous pouvez les transmettre autour de, de les stocker, et plus généralement à l'appel de méthodes sur eux. Avec le soutien de paramètres implicites, il devient un outil très puissant. Prenez l'exemple suivant, par exemple:
object Registry {
import scala.reflect.Manifest
private var map= Map.empty[Any,(Manifest[_], Any)]
def register[T](name: Any, item: T)(implicit m: Manifest[T]) {
map = map.updated(name, m -> item)
}
def get[T](key:Any)(implicit m : Manifest[T]): Option[T] = {
map get key flatMap {
case (om, s) => if (om <:< m) Some(s.asInstanceOf[T]) else None
}
}
}
scala> Registry.register("a", List(1,2,3))
scala> Registry.get[List[Int]]("a")
res6: Option[List[Int]] = Some(List(1, 2, 3))
scala> Registry.get[List[String]]("a")
res7: Option[List[String]] = None
Lors du stockage d'un élément, nous conservons un "Manifeste" de trop. Un Manifeste est une classe dont les instances représentent Scala types. Ces objets ont plus d'information que la JVM ne, ce qui nous permet de tester l'intégralité paramétrée type.
Notez, cependant, que l' Manifest
est encore une évolution de la fonction. Comme un exemple de ses limites, en ce moment, ne sait rien au sujet de la variance, et n'assume tout est co-variante. J'attends qu'il va obtenir plus stable et solide, et une fois à la Scala de réflexion de la bibliothèque, actuellement en cours de développement, est parachevé.