Java-Generika: Klassen- und Schnittstellenbeschränkungen kombiniert
Java-Generika ermöglichen Entwicklern die Definition von Klassen und Methoden, die mit verschiedenen Datentypen arbeiten. Bei der Durchsetzung von Einschränkungen für die verwendbaren Typen kann es jedoch wünschenswert sein, mehrere Einschränkungen anzugeben, einschließlich der Klassen- und Schnittstellenvererbung. Dies wirft die Frage auf: Können wir einen generischen Typ definieren, der eine bestimmte Klasse erweitert und gleichzeitig eine bestimmte Schnittstelle implementiert?
Die Herausforderung, sowohl Klassen- als auch Schnittstellenbeschränkungen zu definieren
Stellen Sie sich das folgende Szenario vor: Wir möchten ein Klassenobjekt erstellen, das nur Klassen akzeptiert, die Klasse A erweitern und Schnittstelle B implementieren. Die separate Verwendung der folgenden generischen Deklarationen ist jedoch nicht möglich genügen:
Class<? extends ClassA> Class<? extends InterfaceB>
Die Lösung: Begrenzte Typparameter kombinieren
Glücklicherweise bieten Java-Generika eine Möglichkeit, mehrere Einschränkungen mithilfe begrenzter Typparameter zu kombinieren. Um einen generischen Typ anzugeben, der sowohl Klasse A erweitert als auch Schnittstelle B implementiert, können wir die folgende Syntax verwenden:
<T extends ClassA & InterfaceB>
Diese Syntax gibt effektiv an, dass die generische Typvariable T sowohl die Klassen- als auch die Schnittstellenbeschränkungen erfüllen muss.
Bewahrung der Binärkompatibilität und komplexer Einschränkungen
Verwendung mehrerer Einschränkungen in Java-Generika ist eine leistungsstarke Technik, kann aber auch zu komplexen und herausfordernden Szenarien führen. Wie in den Java Generics FAQ hervorgehoben, erfordert die Wahrung der Binärkompatibilität manchmal komplizierte Designs wie die folgenden:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Praktische Implementierung mithilfe einer generischen Klasse
Obwohl dies nicht der Fall ist Da es möglich ist, eine Variable mit kombinierten Klassen- und Schnittstelleneinschränkungen direkt zu deklarieren, können wir dazu eine generische Klasse verwenden Wirkung:
class ClassB { } interface InterfaceC { } public class MyClass<T extends ClassB & InterfaceC> { Class<T> variable; }
In diesem Beispiel erstellen wir eine generische Klasse MyClass, die die Variable auf Klassen beschränkt, die ClassB erweitern und InterfaceC implementieren.
Fazit
Durch die Kombination von Klassen- und Schnittstelleneinschränkungen in Java-Generika können Entwickler spezifische Anforderungen an die Typen erzwingen, die verwendet werden können. Durch die Verwendung begrenzter Typparameter können wir generische Klassen und Methoden erstellen, die mehrere Vererbungsbeschränkungen einhalten, was eine größere Flexibilität und Wartbarkeit des Codes ermöglicht.
Das obige ist der detaillierte Inhalt vonKönnen Java-Generika sowohl Klassen- als auch Schnittstellenbeschränkungen gleichzeitig erzwingen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!