2012-04-15 16 views
17

Digamos que tengo una clase A, y que B, C, D se derivan de A.
Si quiero saber cuál es el tipo de objeto al que se hace referencia, puedo declarar :Vea si dos objetos tienen el mismo tipo

// pseudo-code 
if(obj instanceof B) 
    < is B> 
else if(obj instanceof C) 
    < is C> 
else 
    <is D> 

Esto porque estoy seguro de que las clases derivadas de a son solamente B, C y D.
Pero lo que si quiero sólo para comprobar que dos referencias apuntan a la misma clase de objeto?
Así que algo como:

if(obj1 instanceof obj2) 
    <do something> 

Pero, por supuesto, la sintaxis es wrong.How para comprobar esto sin un mil if-else?

Respuesta

39

Usted quiere decir algo así como

obj1.getClass().equals(obj2.getClass()) 

Esto debería devolver true solo si ambos obj1 y obj2 son de la misma clase específica.

Pero esto no funcionará si está comparando A con B extends A. Si desea igualdad que devuelve verdadero incluso si uno es un subtipo de otro, tendrá que escribir una función de comparación más poderosa. Creo que puedes hacerlo haciendo un bucle con getSuperClass() para subir al árbol de jerarquía.

Creo que una solución simple también puede ser hacer A.getClass().isAssignableFrom(B.getClass()), suponiendo que B extends A.

+0

No hay razón para hacer '.equals()', la clase sólo existe una vez en la piscina. – kba

+5

La necesidad no es una cuestión de estilo. – Jack

+0

Eso hace lo que estaba buscando. –

4

Usted podría hacer

if (obj1.getClass() == obj2.getClass()) { ... } 
-2

instanciade necesita señalar hacia una clase, no hacia otro objeto. Para comprobar que los dos objetos ambos vienen del mismo tipo de objeto hacer algo para la siguiente ..

if((obj1 instanceof ClassName) && (obj2 instanceof ClassName)) { 
    do whatever 
} 
+0

Esto es objetivamente incorrecto. Está comprobando si dos objetos son descendientes de algún otro tipo. La pregunta era encontrar si dos objetos son del mismo tipo, pero * arbitrario *. – Adowrath

0

Puesto que B, C y D son subclases de A, y que desea hacer algo con estas clases, que wouldn No use el operador instanceOf. Este solo es útil cuando no hay otra manera.

Puede anular mejor los supermétodos y/o variables, para que pueda usar todos los objetos igual, difícilmente harán algo diferente (por ejemplo, imprimir su propio tipo).

1

Algo como esto:

if(classA.getClass().getName().equals(classB.getClass().getName())) 
    <do something> 
Cuestiones relacionadas