web-dev-qa-db-fra.com

Vérifier si un T générique implémente une interface

j'ai donc cette classe en Java:

public class Foo<T>{
}

et à l'intérieur de cette classe, je veux savoir si T implémente une certaine interface.

Le code suivant NE FONCTIONNE PAS mais c'est l'idée de ce que je veux accomplir:

if(T.class implements SomeInterface){
    // do stuff
}

donc je veux vérifier si la classe T qui a été passée à Foo a implements SomeInterface sur sa signature.

C'est possible? Comment?

19
Budius

Les génériques, curieusement, utilisent également extends pour les interfaces.1 Vous voudrez utiliser:

public class Foo<T extends SomeInterface>{
    //use T as you wish
}

C'est en fait une exigence pour l'implémentation, pas une vérification vraie/fausse.

Pour une vérification vraie/fausse, utilisez des génériques illimités (class Foo<T>{) et assurez-vous d'obtenir un Class<T> vous avez donc un type fiable:

if(SomeInterface.class.isAssignableFrom(tClazz));

tClazz est un paramètre de type Java.lang.Class<T>.

Si vous obtenez un paramètre de type refiable, ce n'est rien de plus que:

if(tParam instanceof SomeInterface){

mais cela ne fonctionnera pas uniquement avec la déclaration générique.

1Si vous souhaitez exiger l'extension d'une classe et de plusieurs interfaces, vous pouvez procéder comme suit: <T extends FooClass & BarInterface & Baz> La classe (une seule, car il n'y a pas d'héritage multiple en Java) doit aller premier, et toutes les interfaces après cela dans n'importe quel ordre.

39
Andrey Akhmetov

vous pouvez le vérifier en utilisant isAssignableFrom

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}

ou pour obtenir le tableau d'interface en tant que

Class[] intfs = clazz.getInterfaces();
4
muthu