Der Compiler kennt mehr Informationen über Typen, als die JVM-Laufzeit leicht darstellen kann. Ein Manifest ist eine Möglichkeit für den Compiler, zur Laufzeit eine interdimensionale Nachricht an den Code über die verlorenen Typinformationen zu senden.
Dies ähnelt der Art und Weise, wie die Kleptonier verschlüsselte Nachrichten in Fossilienbeständen und der "Junk" -DNA von Menschen hinterlassen haben. Aufgrund der Einschränkungen der Lichtgeschwindigkeit und der Gravitationsresonanzfelder können sie nicht direkt kommunizieren. Wenn Sie jedoch wissen, wie Sie das Signal einstellen können, können Sie auf unvorstellbare Weise davon profitieren, wenn Sie entscheiden, was Sie zum Mittagessen essen oder welche Lottozahl Sie spielen möchten.
Es ist nicht klar, ob ein Manifest den angezeigten Fehlern zugute kommen würde, ohne mehr Details zu wissen.
Eine häufige Verwendung von Manifests besteht darin, dass sich Ihr Code je nach statischem Typ einer Sammlung unterschiedlich verhält. Was wäre zum Beispiel, wenn Sie eine Liste [Zeichenfolge] anders als andere Listentypen behandeln möchten:
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
Eine reflexionsbasierte Lösung hierfür würde wahrscheinlich die Überprüfung jedes Elements der Liste beinhalten.
Eine Kontextbindung scheint für die Verwendung von Typklassen in Scala am besten geeignet zu sein und wird hier von Debasish Ghosh gut erklärt:
http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Kontextgrenzen können auch die Methodensignaturen besser lesbar machen. Zum Beispiel könnte die obige Funktion unter Verwendung von Kontextgrenzen wie folgt neu geschrieben werden:
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")
}