Maison > Java > javaDidacticiel > Comment puis-je restreindre une classe générique Java pour étendre une classe et implémenter une interface simultanément ?

Comment puis-je restreindre une classe générique Java pour étendre une classe et implémenter une interface simultanément ?

Barbara Streisand
Libérer: 2024-12-08 02:44:15
original
451 Les gens l'ont consulté

How Can I Restrict a Java Generic Class to Extend a Class and Implement an Interface Simultaneously?

Génériques Java avec une classe et une interface

Lorsque vous travaillez avec des génériques en Java, vous pouvez rencontrer le besoin de restreindre le type d'une classe générique pour étendre une classe spécifique classe et implémenter une interface particulière. Bien qu'il semble raisonnable de s'attendre à ce que les tentatives suivantes réussissent :

Class<? extends ClassA>
Copier après la connexion
Class<? extends InterfaceB>
Copier après la connexion

Malheureusement, une seule d'entre elles peut être appliquée à la fois. Alors, comment pouvons-nous combiner les deux restrictions ?

La solution : plusieurs paramètres de type bornés

En fait, il est possible de spécifier plusieurs interfaces ou une classe et des interfaces dans un paramètre de type générique en utilisant "&":

<T extends ClassA & InterfaceB>
Copier après la connexion

Cela nous permet de définir un type générique qui se limite à la fois à l'extension de la classe spécifiée et à l'implémentation de la classe spécifiée. interface.

Par exemple, si nous définissons une classe ClassB et une interface InterfaceC, nous pouvons créer une classe générique comme suit :

class MyClass<T extends ClassB & InterfaceC> {
    Class<T> variable;
}
Copier après la connexion

Cela garantit que le champ variable de MyClass ne peut que contient des références à des classes qui étendent ClassB et implémentent InterfaceC.

Considérations sur la complexité et la compatibilité

Bien que cette fonctionnalité offre une flexibilité pour définissant des types génériques, cela peut également conduire à des déclarations complexes, comme le montre la déclaration JavaDoc de Collections#max :

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Copier après la connexion

Cette complexité est due à des considérations de compatibilité binaire. Cependant, il est important de noter que cette complexité se rencontre principalement lors de la définition de classes ou de méthodes génériques, et non lors de la déclaration de variables génériques.

Par conséquent, pour atteindre votre objectif de créer un objet de classe qui étend une classe spécifique et implémente une interface spécifique, vous pouvez utiliser l'approche suivante :

class classB { }
interface interfaceC { }

public class MyClass<T extends classB & interfaceC> {
    T variable;
}
Copier après la connexion

Cela vous donnera la restriction souhaitée pour le champ variable de MyClass.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal