75 votes

Vérifier si une sous-classe est une instance d'une classe au moment de l'exécution en Java?

Dans une suite de tests d'applications Android, j'ai une classe comme celle-ci où B est une vue:

 public class A extends B {
... etc...
}
 

maintenant, j'ai une liste d'objets de vue pouvant contenir des objets A, mais dans ce cas, je me soucie seulement de savoir s'ils sont des sous-classes ou des "instances de" B. J'aimerais faire quelque chose comme:

 ArrayList<View> viewList = getViews();
Iterator<View> iterator = viewList.iterator();
while (iterator.hasNext() && viewList != null) {
    View view = iterator.next();
    if (view.getClass().isInstance(B.class)) {
        // this is an instance of B
    }
}
 

Le problème est que lorsque le "si" rencontre un objet A, il n'est pas considéré comme une "instance de B". Y at-il un moyen de faire isSubclassOf ou quelque chose?

Merci.

168voto

Hardcoded Points 2786

Vous avez qu'à lire l'API soigneusement pour ces méthodes. Parfois, vous pouvez obtenir confus très facilement.

C'est soit:

if (B.class.isInstance(view))

API dit: Détermine si l' Objet spécifié (le paramètre) est d'affectation compatible avec l'objet représenté par cette Classe (La classe de l'objet que vous appelez la méthode)

ou:

if (B.class.isAssignableFrom(view.getClass()))

API dit: Détermine si la classe ou de l'interface représenté par cette Classe d'objet est le même, ou est une super-classe ou superinterface de, la classe ou l'interface représentée par la Classe spécifiée paramètre

ou (sans la réflexion et à la recommander un):

if (view instanceof B)

25voto

Kris Points 8813
 if(view instanceof B)
 

Cela retournera true si view est une instance de B ou la sous-classe A (ou une sous-classe de B d'ailleurs).

10voto

Joachim Sauer Points 133411

Peut-être que je manque quelque chose, mais cela ne suffirait-il pas:

 if (view instanceof B) {
    // this view is an instance of B
}
 

7voto

Michael Borgwardt Points 181658

Class.isAssignableFrom() - fonctionne également pour les interfaces. Si vous ne le souhaitez pas, vous devrez appeler getSuperclass() et tester jusqu'à atteindre Object .

6voto

ishmeister Points 421

De Effective C ++, par Scott Meyers:

"Chaque fois que vous vous trouvez en train d'écrire du code de la forme" si l'objet est de type T1, faites quelque chose, mais s'il est de type T2, faites autre chose ", claquez-vous.

Ne pourriez-vous pas utiliser une méthode substituée à la place? Ou peut-être quelque chose comme le modèle de visiteur.

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