2010-11-28 81 views
47

Existe-t-il un moyen facile de vérifier qu'un objet appartient à une classe donnée? Par exemple, je pourrais faireVérifier si un objet appartient à une classe en Java

if(a.getClass() = (new MyClass()).getClass()) 
{ 
    //do something 
} 

mais cela nécessite d'instancier un nouvel objet à la volée à chaque fois, seulement pour le jeter. Existe-t-il un meilleur moyen de vérifier que "a" appartient à la classe "MyClass"?

Répondre

123

Le mot-clé instanceof, tel que décrit par les autres réponses, est généralement ce que vous voulez. N'oubliez pas que instanceof renverra également true pour les superclasses.

Si vous voulez voir si un objet est une instance directe d'une classe, vous pouvez comparer la classe. Vous pouvez obtenir l'objet de classe d'une instance via getClass(). Et vous pouvez accéder de manière statique à une classe spécifique via ClassName.class.

Ainsi, par exemple:

if (a.getClass() == X.class) { 
    // do something 
} 

Dans l'exemple ci-dessus, la condition est vraie si a est une instance de X, mais pas si a est une instance d'une sous-classe de X.

En comparaison:

if (a instanceof X) { 
    // do something 
    } 

Dans l'exemple instanceof, la condition est vraie si a est une instance de X, ou si a est une instance d'une sous-classe de X.

La plupart du temps, instanceof a raison.

4

Essayez l'opérateur instanceof.

15

Utilisez l'opérateur instanceof:

if(a instanceof MyClass) 
{ 
    //do something 
} 
18

Si vous avez besoin de faire cela de façon dynamique, vous pouvez utiliser ce qui suit,

if (clazz.isInstance(a)) { 
     // do something 
} 

clazz est une instance de Class.

+0

ou mieux encore, utilisez IsAssignableFrom (classe) – Chii

+1

@ Chihi Mais alors vous devez appeler à nouveau 'getClass' sur' a', ce que le backhand essayait d'éviter. – gdejohn

+0

non - tout ce dont vous avez besoin est de références aux classes que vous voulez comparer - a.getClass(). IsAssignableFrom (MyClass.class), ou l'inverse. – Chii

3

Je suis d'accord avec l'utilisation de instanceof déjà mentionné.

Un autre avantage de l'utilisation instanceof est que lorsqu'il est utilisé avec une référence nullinstanceof de retournera false, alors que a.getClass() jetterait un NullPointerException.

2

La manière habituelle serait la suivante:

if (a instanceof A) 

Cependant, il y a des cas où vous ne pouvez pas le faire, par exemple lorsque A dans un argument générique.

En raison de l'effacement de type Java, ce qui suit ne compilera pas:

<A> boolean someMethod(Object a) { 
    if (a instanceof A) 
    ... 
} 

et les suivants ne fonctionneront pas (et produira un avertissement unchecked cast):

<A> void someMethod(Object a) { 
    try { 
     A casted = (A)a;  
    } catch (ClassCastException e) { 
     ... 
    } 
} 

Vous pouvez » t cast à A à l'exécution, car à l'exécution, A est essentiellement Object.

Les solutions à ces cas est d'utiliser un Class au lieu de l'argument générique:

void someMethod(Object a, Class<A> aClass) { 
    if (aClass.isInstance(a)) { 
     A casted = aClass.cast(a); 
     ... 
    } 
} 

Vous pouvez ensuite appeler la méthode comme:

someMethod(myInstance, MyClass.class); 
someMethod(myInstance, OtherClass.class);