Génériques Java : contraintes de classe et d'interface combinées
Les génériques Java permettent aux développeurs de définir des classes et des méthodes qui fonctionnent avec différents types de données. Cependant, lors de l'application de contraintes sur les types pouvant être utilisés, il peut être souhaitable de spécifier plusieurs restrictions, y compris l'héritage de classe et d'interface. Cela soulève la question : pouvons-nous définir un type générique qui étend une classe spécifique et implémente simultanément une interface particulière ?
Le défi de définir à la fois les contraintes de classe et d'interface
Considérons le scénario suivant : nous souhaitons créer un objet Class qui accepte uniquement les classes qui étendent la classe A et implémentent l'interface B. Cependant, l'utilisation séparée des déclarations génériques suivantes ne suffire :
Class<? extends ClassA> Class<? extends InterfaceB>
La solution : combiner des paramètres de type limité
Heureusement, les génériques Java offrent un moyen de combiner plusieurs contraintes à l'aide de paramètres de type limité. Pour spécifier un type générique qui étend à la fois la classe A et implémente l'interface B, nous pouvons utiliser la syntaxe suivante :
<T extends ClassA & InterfaceB>
Cette syntaxe spécifie effectivement que la variable de type générique T doit satisfaire à la fois les contraintes de classe et d'interface.
Préserver la compatibilité binaire et les contraintes complexes
L'utilisation de plusieurs contraintes dans les génériques Java est un outil puissant technique, mais cela peut aussi conduire à des scénarios complexes et difficiles. Comme souligné dans la FAQ Java Generics, préserver la compatibilité binaire nécessite parfois des conceptions complexes comme les suivantes :
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Implémentation pratique à l'aide d'une classe générique
Bien que ce ne soit pas le cas possible de déclarer directement une variable avec des contraintes combinées de classe et d'interface, nous pouvons utiliser une classe générique pour obtenir cet effet :
class ClassB { } interface InterfaceC { } public class MyClass<T extends ClassB & InterfaceC> { Class<T> variable; }
Dans cet Par exemple, nous créons une classe générique MyClass qui restreint la variable aux classes qui étendent ClassB et implémentent InterfaceC.
Conclusion
La combinaison des contraintes de classe et d'interface dans les génériques Java permet aux développeurs pour appliquer des exigences spécifiques sur les types qui peuvent être utilisés. En utilisant des paramètres de type limité, nous pouvons créer des classes et des méthodes génériques qui adhèrent à plusieurs restrictions d'héritage, permettant une plus grande flexibilité et une plus grande maintenabilité du code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!