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?
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));
où 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.
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();