2010-11-28 14 views
47

¿Hay alguna manera fácil de verificar que un objeto pertenece a una clase determinada? Por ejemplo, podría hacerComprueba si un objeto pertenece a una clase en Java

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

pero esto requiere instanciar un nuevo objeto sobre la marcha cada vez, solo para descartarlo. ¿Hay una mejor manera de verificar que "a" pertenece a la clase "MyClass"?

Respuesta

123

El instanceof palabra clave, según lo descrito por las otras respuestas, por lo general es lo que cabe esperar. Tenga en cuenta que instanceof devolverá true para superclases también.

Si desea ver si un objeto es una instancia directa de una clase, puede comparar la clase. Puede obtener el objeto de clase de una instancia a través del getClass(). Y puede acceder estáticamente a una clase específica a través del ClassName.class.

Así, por ejemplo:

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

En el ejemplo anterior, la condición es verdadera si a es una instancia de X, pero no si a es una instancia de una subclase de X.

En comparación:

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

En el ejemplo instanceof, la condición es verdadera si a es una instancia de X, o si a es una instancia de una subclase de X.

La mayor parte del tiempo, instanceof tiene razón.

4

Pruebe el operador instanceof.

15

Use el operador instanceof:

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

Si alguna vez tiene que hacer esto de forma dinámica, puede utilizar la siguiente,

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

donde clazz es una instancia de Class.

+0

o mejor aún, utilizar IsAssignableFrom (Clase) – Chii

+1

@Chii Pero luego debe llamar 'getClass' en' a' de nuevo, que es lo que thebackhand estaba tratando de evitar. – gdejohn

+0

no, todo lo que necesita es referencias a las clases que quiere comparar: a.getClass(). IsAssignableFrom (MyClass.class), o viceversa. – Chii

3

Estoy de acuerdo con el uso de instanceof ya mencionado.

Un beneficio adicional del uso de instanceof es que cuando se utiliza con una referencia instanceofnull del volverán false, mientras a.getClass() podría lanzar una NullPointerException.

2

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); 
Cuestiones relacionadas