435 votes

Wildcarding Generics Java avec plusieurs Classes

Je veux avoir un objet de classe, mais je veux forcer quelque classe qu’il représente pour étendre la classe A et implémente l’interface B.

Je peux faire :

Ou :

mais je ne peux pas faire les deux. Y a-t-il un moyen de faire cela ?

695voto

Eddie Points 27755

En fait, vous pouvez faire ce que vous voulez. Si vous souhaitez fournir des interfaces multiples, ou à une classe et à des interfaces, vous devez avoir votre générique ressembler à quelque chose comme ceci:

<T extends ClassA & InterfaceB>

Voir les Génériques Tutoriel à sun.com, plus précisément le Délimitée Paramètres de Type de la section, au bas de la page. Vous pouvez réellement liste de plus d'une interface si vous le souhaitez, à l'aide de & InterfaceName pour chacun ce dont vous avez besoin.

Cela peut être arbitrairement complexe. Pour le démontrer, voir la JavaDoc de la déclaration d' Collections#max, ce qui (enroulé sur deux lignes):

public static <T extends Object & Comparable<? super T>> T
                                           max(Collection<? extends T> coll)

pourquoi faire si compliqué? Comme dit dans le Java Génériques FAQ: afin De préserver la compatibilité binaire.

Il ressemble à cela ne fonctionne pas pour la déclaration de la variable, mais il ne fonctionne pas lors de la mise en générique de la frontière sur une classe. Ainsi, pour faire ce que vous voulez, vous pourriez avoir à passer par quelques étapes. Mais vous pouvez le faire. Vous pouvez faire quelque chose comme ça, de mettre un générique limites de votre classe, puis:

class classB { }
interface interfaceC { }

public class MyClass<T extends classB & interfaceC> {
    Class<T> variable;
}

pour obtenir de l' variable qui a la restriction que vous le souhaitez. Pour plus d'informations et des exemples, consultez la page 3 de Génériques en Java 5.0. Remarque, en <T extends B & C>, le nom de la classe doit venir en premier, et les interfaces suivre. Et bien sûr, vous pouvez seulement de la liste d'une seule classe.

21voto

user2861738 Points 11

Vous ne pouvez pas le faire avec les paramètres de type « anonyme » (c’est à dire, des caractères génériques qui utilisent `` ), mais vous pouvez le faire avec des paramètres de type « nommés ». Tout simplement de déclarer le paramètre de type au niveau de la méthode ou classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X