Typ-Deskriptoren
reflectType beschreibt jeden Typ, nicht nur Klassen. Das Ergebnis ist ein TypeDescriptor, bei einem generischen Typ ein ParameterizedTypeDescriptor mit seinen Argumenten.
Parametrisiert
Argumente bleiben erhalten
Eine Box[String] ist nicht einfach eine Box. Matche auf ParameterizedTypeDescriptor, um Rohklasse und jedes Typargument zu erreichen.
- reflectType[Box[String]].typeName
- demo.Box[java.lang.String]
- typeArguments
- java.lang.String
- reflect[Box[?]].typeParameterNames
- T
scala
case class Box[T](value: T)
ReflectMacros.reflectType[Box[String]] match
case parameterized: ParameterizedTypeDescriptor =>
parameterized.rawType.simpleName // Box
parameterized.typeArguments.map(_.typeName)
case other => other.typeName
Varianten
Vier Arten von Deskriptor
Alle implementieren TypeDescriptor; Code, der nur Namen, Annotationen oder Basistypen braucht, muss nicht wissen, welchen er hält.
- ClassDescriptor
- Eine Klasse mit Properties, Konstruktoren und Flags.
- ParameterizedTypeDescriptor(rawType, typeArguments)
- Eine generische Klasse, angewandt auf Argumente.
- TypeVariableDescriptor(name, bounds)
- Ein Typparameter wie T, mit seinen Schranken.
- ArrayTypeDescriptor(componentType)
- Ein Array; sein Name endet auf [].