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);
ou mieux encore, utilisez IsAssignableFrom (classe) – Chii
@ Chihi Mais alors vous devez appeler à nouveau 'getClass' sur' a', ce que le backhand essayait d'éviter. – gdejohn
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