Existe-t-il un moyen simple de vérifier qu’un objet appartient à une classe donnée? Par exemple, je pourrais faire
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
mais cela nécessite l'instanciation d'un nouvel objet à la volée à chaque fois, uniquement pour le rejeter. Existe-t-il un meilleur moyen de vérifier que "a" appartient à la classe "MyClass"?
Le mot-clé instanceof
, décrit par les autres réponses, correspond généralement à ce que vous souhaitez. Gardez à l'esprit que instanceof
retournera é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 statiquement à une classe spécifique via ClassName.class
.
Donc 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 de sous-classe de X
.
La plupart du temps, instanceof
a raison.
Si vous avez besoin de le faire dynamiquement, vous pouvez utiliser ce qui suit,
if (clazz.isInstance(a)) {
// do something
}
où clazz
est une instance de Class
.
Utilisez l'opérateur instanceof
:
if(a instanceof MyClass)
{
//do something
}
Je suis d'accord avec l'utilisation de instanceof
déjà mentionnée.
Un autre avantage de l'utilisation de instanceof
est que, lorsqu'il est utilisé avec une référence null
, instanceof
renvoie false
, alors que a.getClass()
renvoie un NullPointerException
.
Essayez l'opérateur instanceof
.
La manière habituelle serait:
if (a instanceof A)
Cependant, dans certains cas, vous ne pouvez pas le faire, par exemple lorsque A
dans un argument générique.
En raison de l'effacement du type Java, les éléments suivants ne seront pas compilés:
<A> boolean someMethod(Object a) {
if (a instanceof A)
...
}
et ce qui suit ne fonctionnera pas (et produira un unchecked cast
Attention):
<A> void someMethod(Object a) {
try {
A casted = (A)a;
} catch (ClassCastException e) {
...
}
}
Vous ne pouvez pas transtyper vers A
au moment de l'exécution, car au moment de l'exécution, A
est essentiellement Object
.
La solution à de tels cas consiste à utiliser un Class
à la place 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 en tant que:
someMethod(myInstance, MyClass.class);
someMethod(myInstance, OtherClass.class);