Bei der Arbeit mit Generika in Java kann es sein, dass Sie den Typ einer generischen Klasse einschränken müssen, um eine bestimmte Klasse zu erweitern Klasse und Implementierung einer bestimmten Schnittstelle. Es ist zwar davon auszugehen, dass die folgenden Versuche erfolgreich sein werden:
Class<? extends ClassA>
Class<? extends InterfaceB>
Leider kann jeweils nur einer davon angewendet werden. Wie können wir also die beiden Einschränkungen kombinieren?
Tatsächlich ist es möglich, mehrere Schnittstellen oder eine Klasse und Schnittstellen in einem generischen Typparameter anzugeben „&“:
<T extends ClassA & InterfaceB>
Dies ermöglicht uns die Definition eines generischen Typs, der sowohl auf die Erweiterung der angegebenen Klasse als auch auf die Implementierung der angegebenen Klasse beschränkt ist Schnittstelle.
Wenn wir beispielsweise eine Klasse ClassB und eine Schnittstelle InterfaceC definieren, können wir eine generische Klasse wie folgt erstellen:
class MyClass<T extends ClassB & InterfaceC> { Class<T> variable; }
Dadurch wird sichergestellt, dass das Variablenfeld von MyClass nur kann enthalten Verweise auf Klassen, die ClassB erweitern und InterfaceC implementieren.
Während diese Funktion Flexibilität beim Definieren bietet Bei generischen Typen kann es auch zu komplexen Deklarationen kommen, wie in der JavaDoc-Deklaration von Collections#max zu sehen ist:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Diese Komplexität entsteht aufgrund von Überlegungen zur Binärkompatibilität. Es ist jedoch wichtig zu beachten, dass diese Komplexität hauptsächlich bei der Definition generischer Klassen oder Methoden und nicht bei der Deklaration generischer Variablen auftritt.
Daher müssen Sie Ihr Ziel erreichen, ein Klassenobjekt zu erstellen, das eine bestimmte Klasse erweitert und eine bestimmte Schnittstelle implementiert, können Sie den folgenden Ansatz verwenden:
class classB { } interface interfaceC { } public class MyClass<T extends classB & interfaceC> { T variable; }
Dadurch erhalten Sie die gewünschte Einschränkung für das Variablenfeld von MyClass.
Das obige ist der detaillierte Inhalt vonWie kann ich eine generische Java-Klasse darauf beschränken, eine Klasse zu erweitern und gleichzeitig eine Schnittstelle zu implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!