Comprobar si un objeto pertenece a una clase en Java [duplicate]

3 minutos de lectura

¿Hay una manera fácil de verificar que un objeto pertenece a una clase dada? Por ejemplo, podría hacer

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”?

avatar de usuario
dhm

los instanceof La palabra clave, como se describe en las otras respuestas, suele ser lo que desea. Manten eso en mente instanceof regresará 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 de getClass(). Y puede acceder estáticamente a una clase específica a través de 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 Xpero no si a es una instancia de una subclase de X.

En comparación:

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

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

La mayor parte del tiempo, instanceof es correcto.

avatar de usuario
gdejohn

Si alguna vez necesita hacer esto dinámicamente, puede usar lo siguiente:

boolean isInstance(Object object, Class<?> type) {
    return type.isInstance(object);
}

Puede obtener una instancia de java.lang.Class llamando al método de instancia Object::getClass en cualquier objeto (devuelve el Class del cual ese objeto es una instancia), o puede usar literales de clase (por ejemplo, String.class, List.class, int[].class). También hay otras formas, a través de la API de reflexión (que Class en sí mismo es el punto de entrada para).

  • o mejor aún, use IsAssignableFrom(Class)

    – Chii

    28 de noviembre de 2010 a las 6:05

  • @Chii Pero entonces tienes que llamar getClass en a de nuevo, que es lo que el revés intentaba evitar.

    – gdejohn

    28 de noviembre de 2010 a las 9:13

  • no, todo lo que necesita son referencias a las clases que desea comparar: a.getClass().isAssignableFrom(MyClass.class) , o al revés.

    – Chii

    29 de noviembre de 2010 a las 8:29

  • @Chii Eso suponiendo que sabe con qué clase quiere comparar antes de tiempo. Mi respuesta fue por hacerlo dinámicamente.

    – gdejohn

    29 de noviembre de 2010 a las 11:36

  • ¿Funciona esto también para objetos heredados? Me gusta si la clase Sub deriva de Super y en un método, la firma es method(Super super) entonces si evalúo super isinstanceof Subfuncionará si un objeto de tipo Sub se pasa como parámetro a este método?

    – Aritro Shome

    7 de octubre de 2021 a las 4:17

Utilizar el instanceof operador:

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

Pruebe el operador instanceof.

La forma habitual sería:

if (a instanceof A)

Sin embargo, hay casos en los que no puede hacer esto, como cuando A en un argumento genérico.

Debido al borrado de tipo de Java, lo siguiente no se compilará:

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

y lo siguiente no funcionará (y producirá un unchecked cast advertencia):

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

No puedes enviar a A en tiempo de ejecución, porque en tiempo de ejecución, A Es esencial Object.

La solución 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);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad