La forma más habitual sería:
if (a instanceof A)
Sin embargo, hay casos en que no se puede hacer esto, por ejemplo, cuando A
en un argumento genérico.
Debido al tipo de borrado de Java, lo siguiente será que no se compile:
<A> boolean someMethod(Object a) {
if (a instanceof A)
...
}
y el siguiente no funciona (y producirá una advertencia unchecked cast
):
<A> void someMethod(Object a) {
try {
A casted = (A)a;
} catch (ClassCastException e) {
...
}
}
Usted puede' t emitido a A
en tiempo de ejecución, porque en el tiempo de ejecución, A
es esencialmente Object
.
Las soluciones a estos casos es utilizar un Class
en lugar del argumento genérico:
void someMethod(Object a, Class<A> aClass) {
if (aClass.isInstance(a)) {
A casted = aClass.cast(a);
...
}
}
A continuación, puede llamar al método como:
someMethod(myInstance, MyClass.class);
someMethod(myInstance, OtherClass.class);
o mejor aún, utilizar IsAssignableFrom (Clase) – Chii
@Chii Pero luego debe llamar 'getClass' en' a' de nuevo, que es lo que thebackhand estaba tratando de evitar. – gdejohn
no, todo lo que necesita es referencias a las clases que quiere comparar: a.getClass(). IsAssignableFrom (MyClass.class), o viceversa. – Chii