Zum Inhalt springen
Anjunar/ DOCS

Hierarchie und Subtypen

Eine ResolvedClass kennt jeden Obertyp, jeden gegen den Ausgangstyp aufgelöst. Darauf steht alles, was geerbt wird.

Reihenfolge

Der Typ, seine Interfaces, dann aufwärts

hierarchy beginnt mit dem Typ selbst, dann seinen Interfaces, dann der Oberklasse mit ihren Interfaces, bis ausschließlich Object.

scala
package example trait Named { def name: String } abstract class Repository[E] extends Named class UserRepository extends Repository[User] { def name = "users" } TypeResolver.resolve(classOf[UserRepository]).hierarchy .foreach(entry => println(entry.underlying.getTypeName))
Ausgabe
example.UserRepository example.Repository<example.User> example.Named
Aufgelöst, nicht deklariert

Repository erscheint als Repository<User>, nicht als Repository<E>. Jedes Member, das über diesen Eintrag gefunden wird, ist entsprechend typisiert.

Prüfungen

Subtypen mit Generics

<:< vergleicht vollständige Typen, nicht nur Rohklassen. Primitive Typen werden zuerst gewrappt; int und Integer verhalten sich gleich.

scala
val users = TypeResolver.resolve(classOf[UserRepository]) val repository = TypeResolver.resolve(classOf[Repository[?]]) val items = users.findField("items").fieldType val collection = TypeResolver.resolve(classOf[java.util.Collection[?]]) println(users <:< repository) // true println(items <:< collection) // true
Vererbung

Was die Hierarchie speist

Vier Sammlungen laufen durch die Hierarchie; ihre declared-Gegenstücke bleiben bei der Klasse selbst.

fields · declaredFields
Alle sichtbaren Felder, verdeckte entfernt · die eigenen der Klasse.
methods · declaredMethods
Alle Methoden, überschriebene entfernt · die eigenen der Klasse.
constructors · declaredConstructors
Konstruktoren jeder Klasse der Hierarchie · die eigenen der Klasse.
annotations · declaredAnnotations
Annotationen jedes Obertyps · die eigenen der Klasse.
constructors überschreitet Klassengrenzen

constructors enthält die Konstruktoren der Oberklassen, die die Unterklasse nicht erzeugen können. Nimm declaredConstructors oder findConstructor, um Instanzen zu erzeugen.