Diese Antwort verwendet die Manifest
-API, die ab Scala 2.10 veraltet ist. Bitte lesen Sie die Antworten unten für aktuellere Lösungen.
Scala wurde mit Type Erasure definiert, weil die Java Virtual Machine (JVM), im Gegensatz zu Java, keine Generics erhalten hat. Das bedeutet, dass zur Laufzeit nur die Klasse existiert, nicht aber ihre Typparameter. In diesem Beispiel weiß die JVM, dass sie mit einer scala.collection.immutable.List
, aber nicht, dass diese Liste parametrisiert ist mit Int
.
Glücklicherweise gibt es in Scala eine Funktion, mit der Sie das umgehen können. Es ist die Manifest . Ein Manifest ist eine Klasse, deren Instanzen Objekte sind, die Typen darstellen. Da es sich bei diesen Instanzen um Objekte handelt, können Sie sie weitergeben, speichern und im Allgemeinen Methoden für sie aufrufen. Mit der Unterstützung von impliziten Parametern wird es zu einem sehr mächtigen Werkzeug. Nehmen Sie zum Beispiel das folgende Beispiel:
object Registry {
import scala.reflect.Manifest
private var map= Map.empty[Any,(Manifest[_], Any)]
def register[T](name: Any, item: T)(implicit m: Manifest[T]) {
map = map.updated(name, m -> item)
}
def get[T](key:Any)(implicit m : Manifest[T]): Option[T] = {
map get key flatMap {
case (om, s) => if (om <:< m) Some(s.asInstanceOf[T]) else None
}
}
}
scala> Registry.register("a", List(1,2,3))
scala> Registry.get[List[Int]]("a")
res6: Option[List[Int]] = Some(List(1, 2, 3))
scala> Registry.get[List[String]]("a")
res7: Option[List[String]] = None
Wenn wir ein Element speichern, speichern wir auch ein "Manifest" davon. Ein Manifest ist eine Klasse, deren Instanzen Scala-Typen darstellen. Diese Objekte verfügen über mehr Informationen als die JVM, die es uns ermöglichen, auf den vollständigen, parametrisierten Typ zu testen.
Beachten Sie jedoch, dass eine Manifest
ist ein noch zu entwickelndes Merkmal. Ein Beispiel für seine Grenzen ist, dass es derzeit nichts über Varianz weiß und davon ausgeht, dass alles kovariant ist. Ich erwarte, dass es stabiler und solider wird, sobald die Scala-Reflexionsbibliothek, die derzeit entwickelt wird, fertiggestellt ist.