Le compilateur connaît plus d'informations sur les types que le runtime JVM ne peut facilement en représenter. Un manifeste est un moyen pour le compilateur d'envoyer un message interdimensionnel au code au moment de l'exécution sur les informations de type qui ont été perdues.
Ceci est similaire à la façon dont les Kleptoniens ont laissé des messages codés dans les archives fossiles et l'ADN «indésirable» des humains. En raison des limites de la vitesse de la lumière et des champs de résonance gravitationnelle, ils sont incapables de communiquer directement. Mais, si vous savez comment syntoniser leur signal, vous pouvez bénéficier d'une manière que vous ne pouvez pas imaginer, en décidant quoi manger pour le déjeuner ou quel numéro de loto jouer.
Il n'est pas clair si un manifeste bénéficierait des erreurs que vous voyez sans connaître 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 passe-t-il si vous souhaitez 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.
Un contexte lié semble le plus adapté à l'utilisation de classes de types dans 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 également rendre les signatures de méthode plus lisibles. Par exemple, la fonction ci-dessus pourrait être réécrite en utilisant des limites de contexte comme ceci:
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")
}