Cela a probablement déjà été demandé, mais une recherche rapide n'a fait apparaître que la même question posée pour C #. Vois ici.
Ce que je veux essentiellement faire, c'est vérifier si un objet donné implémente une interface donnée.
J'ai en quelque sorte trouvé une solution, mais ce n'est tout simplement pas assez confortable pour l'utiliser fréquemment dans des déclarations if ou case et je me demandais si Java n'avait pas de solution intégrée.
public static Boolean implementsInterface(Object object, Class interf){
for (Class c : object.getClass().getInterfaces()) {
if (c.equals(interf)) {
return true;
}
}
return false;
}
EDIT: Ok, merci pour vos réponses. Surtout à Damien Pollet et Noldorin, vous m'avez fait repenser mon design pour ne plus tester d'interfaces.
Réponses:
L'
instanceof
opérateur effectue le travail de manièreNullPointerException
sûre. Par exemple:cède vrai. Puisque:
renvoie false, l'
instanceof
opérateur est null safe (le code que vous avez publié ne l'est pas).instanceof est l'alternative intégrée et sécurisée à la compilation à Class # isInstance (Object)
la source
MyClass.class
ouMyInterface.class
dans votre code source. Les littéraux de classe peuvent faire référence à des classes, des interfaces et des types primitifs, et renverront une instance correspondante de la classe Class. Mon point est que l'OP n'utilise pas un littéral de classe, mais une instance de la classe Class à la place, et malheureusement l'opérateur de droite duinstanceof
mot - clé doit être un littéral de classe, pas une instance de la classe Class.Cela devrait faire:
Par exemple,
évalue à
true
.la source
Je préfère
instanceof
:ce qui est beaucoup plus courant et lisible que
SomeType.isInstance(obj)
la source
if (obj instanceof SomeType) { ... }
c'est statique (c'est-à-dire qu'il ne peut pas changer au moment de l'exécution) et qu'ilSomeType.isInstance(obj)
est dynamique.c'était facile :
la source
Si vous souhaitez tester les interfaces:
}
clazz est une interface et myType est un type que vous avez défini qui peut implémenter un certain nombre d'interfaces. Avec ce code, vous obtenez uniquement les types qui implémentent une interface définie
la source
J'ai eu ce problème ce soir avec Android et après avoir regardé les solutions javadoc, j'ai trouvé cette vraie solution de travail juste pour les gens comme moi qui ont besoin d'un peu plus qu'une explication javadoc.
Voici un exemple de travail avec une interface réelle utilisant android java. Il vérifie l'activité qui a appelé à implémenter l'interface AboutDialogListener avant de tenter de convertir le champ AboutDialogListener.
... Plus tard, je vérifie si le champ adl est! Null avant d'appeler l'interface
la source
Avec Apache commons-lang ArrayUtils, voyez si l'interface dont vous avez besoin est contenue dans les interfaces de votre objet
la source