Können sich Typvariablen auf den aktuellen Typ beziehen?
Angenommen, Sie möchten eine Funktion erstellen, die eine Instanz des aktuellen Typs zurückgibt. Gibt es eine Möglichkeit sicherzustellen, dass sich T speziell auf den Subtyp bezieht (z. B. sollte sich T auf B in Klasse B beziehen)?
Implementierung der Lösung
Erweitern der Antwort von StriplingWarrior Um dies zu erreichen, ist das folgende Muster unerlässlich (ein Rezept für einen hierarchisch fließenden Builder). API):
LÖSUNG
Definieren Sie eine abstrakte Basisklasse oder Schnittstelle:
Erstellen Sie eine Vertrag zum Erhalten des Laufzeittyps einer Instanz, die die erweitert Klasse:
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); }
Zwischenabstrakte Klassen erstellen:
Zwischenklassen behalten den rekursiven Typparameter SELF bei. Sie sollten abstrakt sein, um eine direkte Verwendung zu verhindern:
public abstract class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> {...}
Blattklassen definieren:
Die endgültigen Klassen lösen den SELF-Typparameter mit ihren auf eigener Typ. Machen Sie sie aus Sicherheitsgründen endgültig:
public final class MyLeafClass extends MyBaseClass<MyLeafClass> {...}
Beispielverwendung:
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
Vorsicht und Schlussfolgerung
Dieses Muster ist eine Implementierung der „seltsam wiederkehrenden Vorlage“ in Java. Obwohl es leistungsstark ist, erfordert es eine sorgfältige Verwendung und sollte am besten nur internen APIs vorbehalten sein. Das Muster ist von Natur aus unsicher und muss mit Vorsicht verwendet werden, um Missbrauch zu vermeiden. Bei effektivem Einsatz kann es jedoch die Ausdruckskraft und Benutzerfreundlichkeit von Builder-APIs verbessern.
Das obige ist der detaillierte Inhalt vonKönnen Typvariablen in Java auf ihre definierende Klasse verweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!