Zum Inhalt springen
Anjunar/ DOCS

Generics

Eine generische Klasse behält ihre Typparameter mit ihren Schranken, und ein angewandter Typ behält seine Argumente. Beides ist in Scala.js sichtbar, wo es die generischen Signaturen der JVM nicht gibt.

Parameter

Typvariablen mit Schranken

typeParameters hält einen TypeVariableDescriptor pro Parameter; seine bounds sind die Namen seiner oberen Schranken.

E
scala.Nothing, demo.Entity
K
scala.Nothing, scala.Any
scala
trait Entity { def id: String } class Repository[E <: Entity, K](val name: String) ReflectMacros.reflect[Repository[?, ?]].typeParameters.collect { case variable: TypeVariableDescriptor => variable.name -> variable.bounds.toList }
Argumente

Angewandte Typen

reflectType eines angewandten Typs liefert einen ParameterizedTypeDescriptor. Sein rawType ist der ClassDescriptor, seine typeArguments die Argumente der Reihe nach.

reflectType[Map[String, List[Int]]].typeName
scala.collection.immutable.Map[java.lang.String, scala.collection.immutable.List[scala.Int]]
typeArguments(1).typeName
scala.collection.immutable.List[scala.Int]
scala
ReflectMacros.reflectType[Map[String, List[Int]]] match case parameterized: ParameterizedTypeDescriptor => parameterized.typeArguments(1) // itself parameterized: List[Int] case other => other
Properties

Generische Property-Typen

Der propertyType einer Property ist ebenfalls ein TypeDescriptor; ein List[String]-Feld nennt dir seinen Elementtyp.

reflect[Box[?]].getProperty("value").map(_.propertyType.typeName)
Some(T)
Parameter bleiben Parameter

Der Deskriptor einer generischen Klasse beschreibt ihre Deklaration: eine Property vom Typ T sagt T. Reflektiere den angewandten Typ mit reflectType, wenn du das Argument brauchst.