Es gibt eine praktische Implementierung von asInstanceOfOpt
, einer sicheren Version von asInstanceOf
, die in der Antwort zu Wie schreibe ich" asInstanceOfOption "in Scala . Es scheint, dass Scala 2.9.1, diese Lösung jetzt nur mit AnyRef funktioniert:
Kann dies neu geschrieben werden, um Any zu unterstützen?
Wenn Sie in der Scala-API suchen, nimmt die Funktion singleType
einen Parameter vom Typ AnyRef. Ich kenne den Hintergrund für diese Entscheidung nicht wirklich, aber es scheint, dass Sie es umgehen müssen. Anstatt die Methode singleType
zu verwenden, würde ich vorschlagen, die classType
-Methode zu verwenden, die grundsätzlich für jede Klasse ein Manifest erstellen kann. Es wird etwas mehr Code benötigt, aber es könnte in etwa so aussehen:
Hier ist der Arbeitscode für 2.9.x. Es wird Verwarnungswarnungen für 2.10.x geben, aber die Verwendung von ClassTag
anstelle von Manifest
und runtimeClass
anstelle von erasure
wird sie beheben.
Testergebnisse:
%Vor% Der Code ist etwas ausführlicher als hier gebraucht, hauptsächlich weil ich ihn aus einer bestehenden Codebasis von mir genommen habe, wo ich ifInstanceOfBody woanders wiederverwende. Das Einfügen in asInstanceOfOpt
würde das beheben und den Code etwas verkürzen, aber das meiste ist für primitiveToBoxedMap
, und vertraue mir, dass ich so etwas in der Scala-Standardbibliothek nicht finden konnte.
Du könntest formlos aus Miles Sabin tippen:
Casting mit dem Typparameter eingeben
Es behandelt Primitive und Boxen:
%Vor%Sie können die Quelle hier sehen, um zu sehen, wie sie geschrieben ist:
Tags und Links scala