Seit Scala 2.7.2 gibt es etwas, Manifest
das eine Problemumgehung für das Löschen von Java-Typen darstellt. Aber wie funktioniert das Manifest
genau und warum / wann müssen Sie es verwenden?
Der Blog-Beitrag Manifests: Reified Types von Jorge Ortiz erklärt einige davon, erklärt aber nicht, wie man es zusammen mit Kontextgrenzen verwendet .
Was ist ClassManifest
der Unterschied Manifest
?
Ich habe Code (Teil eines größeren Programms, kann hier nicht einfach eingefügt werden), der einige Warnungen in Bezug auf das Löschen des Typs enthält. Ich vermute, ich kann diese Probleme mithilfe von Manifesten lösen, bin mir aber nicht sicher, wie.
Antworten:
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:
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:
quelle
Keine vollständige Antwort, aber in Bezug auf den Unterschied zwischen
Manifest
undClassManifest
finden Sie ein Beispiel im Scala 2.8-Array
Artikel :Beispiel:
(Siehe diese SO-Frage zur Veranschaulichung )
quelle
Ein Manifest sollte generische Typen bestätigen, deren Typ gelöscht wird, damit sie auf der JVM ausgeführt werden können (die keine Generika unterstützt). Sie hatten jedoch einige schwerwiegende Probleme: Sie waren zu simpel und konnten das Typensystem von Scala nicht vollständig unterstützen. Sie waren so veraltet in Scala 2.10 und werden ersetzt durch
TypeTag
s (die im Wesentlichen , was der Scala - Compiler selbst verwendet Typen darzustellen, und daher voll Scala Typen unterstützen). Weitere Einzelheiten zum Unterschied finden Sie unter:Mit anderen Worten
Vor dem 04.01.2013, als Scala 2.10 veröffentlicht wurde .
quelle
Lassen Sie uns auch
manifest
inscala
sources (Manifest.scala
) chicken , wir sehen:Also in Bezug auf folgenden Beispielcode:
Wir können sehen, dass die
manifest
function
Suche nach einem Impliziten,m: Manifest[T]
das den vontype parameter
Ihnen in unserem Beispielcode angegebenen entspricht, es warmanifest[String]
. Wenn Sie also etwas anrufen wie:Sie prüfen, ob der Strom,
implicit m
den Sie in Ihrer Funktion definiert haben, vom Typ ist,manifest[String]
und damanifest
es sich um eine Funktion vom Typ handeltmanifest[T]
, würde nach einem bestimmten gesuchtmanifest[String]
und festgestellt, ob es einen solchen Impliziten gibt.quelle