2012-04-15 13 views
17

Diciamo che ho una classe A, e che B, C, D sono derivati ​​da A.
Se voglio sapere qual è il tipo di oggetto referenziato, posso dichiararlo :Vedere se due oggetti hanno lo stesso tipo

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

Questo perché sono sicuro che le classi derivate da a sono solo B, C e D.
Ma cosa succede se voglio solo verificare che due riferimenti puntano allo stesso tipo di oggetto?
Quindi qualcosa di simile:

if(obj1 instanceof obj2) 
    <do something> 

Ma naturalmente la sintassi è wrong.How controllare questo senza un migliaio if-else?

risposta

39

Vuoi dire qualcosa di simile

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

Questo dovrebbe restituire vero solo se entrambi obj1 e obj2 sono della stessa classe specifica.

Ma questo non funzionerà se si confronta A con B extends A. Se vuoi che l'uguaglianza ritorni vera anche se uno è un sottotipo di un altro, dovrai scrivere una funzione di confronto più potente. Penso che tu possa farlo eseguendo il ciclo con getSuperClass() per salire all'albero gerarchico.

Penso che una soluzione semplice possa essere anche fare A.getClass().isAssignableFrom(B.getClass()), supponendo che B extends A.

+0

Non v'è alcun motivo per fare '.equals()', la classe esiste solo una volta in piscina. – kba

+5

La necessità non è una questione di stile. – Jack

+0

Questo fa quello che stavo cercando. –

4

Si potrebbe fare

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

instanceof deve puntare a una classe, non a un altro oggetto. Per verificare che due oggetti entrambi provengono dallo stesso tipo di oggetto fare qualcosa al seguente ..

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

Questo è effettivamente errato. Stai verificando che due oggetti siano discendenti di un altro tipo. La domanda era di scoprire se due oggetti sono dello stesso tipo, ma * arbitrario *. – Adowrath

0

Dal B, C e D sono sottoclassi di A, e si vuole fare qualcosa con queste classi, ho wouldn utilizzare l'operatore instanceOf. Questo è utile solo quando non c'è altro modo.

È possibile eseguire l'override dei metodi e/o delle variabili eccellenti, in modo da poter utilizzare tutti gli oggetti allo stesso modo, in modo ostinato essi faranno qualcosa di diverso (ad esempio stampando il proprio tipo).

1

Qualcosa di simile a questo:

if(classA.getClass().getName().equals(classB.getClass().getName())) 
    <do something> 
Problemi correlati