Le compilateur connaît plus d'informations sur les types que le moteur d'exécution de la JVM ne peut facilement représenter. Un manifeste est un moyen pour le compilateur d'envoyer un message inter-dimensionnel au code au moment de l'exécution concernant les informations sur les types qui ont été perdues.
Il n'est pas certain qu'un manifeste puisse corriger les erreurs que vous constatez sans avoir plus de détails.
Une utilisation courante des Manifests consiste à faire en sorte que votre code se comporte différemment en fonction du type statique d'une collection. Par exemple, que se passerait-il si vous vouliez traiter une List[String] différemment des autres types de List :
def foo[T](x: List[T])(implicit m: Manifest[T]) = {
if (m <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
foo(List("one", "two")) // Hey, this list is full of strings
foo(List(1, 2)) // Non-stringy list
foo(List("one", 2)) // Non-stringy list
Une solution basée sur la réflexion impliquerait probablement d'inspecter chaque élément de la liste.
Le context bound semble le mieux adapté à l'utilisation des classes de type en Scala, et est bien expliqué ici par Debasish Ghosh : http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Les limites de contexte peuvent aussi simplement rendre les signatures de méthodes plus lisibles. Par exemple, la fonction ci-dessus pourrait être réécrite en utilisant des bornes de contexte comme suit :
def foo[T: Manifest](x: List[T]) = {
if (manifest[T] <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
2 votes
Une discussion a eu lieu sur la liste de diffusion à propos de la différence entre Manifest et ClassManifest, voir scala-programming-language.1934581.n4.nabble.com/
0 votes
Voir aussi Scala : Qu'est-ce qu'un TypeTag et comment l'utiliser ?