2012-04-15 14 views
17

Nehmen wir an, ich habe eine Klasse A, und dass B, C, D von A abgeleitet sind. Wenn ich wissen möchte, was der Typ eines Objekts ist, kann ich deklarieren :Sehen Sie, ob zwei Objekte den gleichen Typ haben

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

Dies, weil ich sicher bin, dass die von A abgeleiteten Klassen nur B, C und D.
Aber was sind, wenn ich, dass zwei Verweise auf die gleiche Art von Objekt nur überprüfen will zeigen?
So etwas wie:

if(obj1 instanceof obj2) 
    <do something> 

Aber natürlich ist die Syntax ist wrong.How diese tausend if-else ohne eine überprüfen? Dies sollte return true nur, wenn beide obj1 und obj2 wie

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

Antwort

39

Sie etwas bedeuten tun der gleichen spezifischen Klasse.

Dies funktioniert jedoch nicht, wenn Sie A mit B extends A vergleichen. Wenn Sie eine Gleichheit wünschen, die "wahr" zurückgibt, selbst wenn es sich um einen Subtyp eines anderen handelt, müssen Sie eine leistungsfähigere Vergleichsfunktion schreiben. Ich denke, dass Sie es tun können, indem Sie mit getSuperClass() in den Hierarchiebaum gehen.

Ich denke, eine einfache Lösung kann auch A.getClass().isAssignableFrom(B.getClass()) zu tun, unter der Annahme, dass .

+0

Es gibt keinen Grund '.equals zu tun()', nur die Klasse existiert einmal im Pool. – kba

+5

Notwendigkeit ist keine Frage des Stils. – Jack

+0

Das macht, was ich gesucht habe. –

4

Sie könnten

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

instanceof muss auf eine Klasse verweisen, nicht auf ein anderes Objekt. Um zu überprüfen, dass zwei Objekte kommen beide aus der gleichen Art von Objekt etwas tun, um den folgenden ..

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

Dies ist sachlich falsch. Sie überprüfen, ob zwei Objekte Nachkommen eines anderen Typs sind. Die Frage war, ob zwei Objekte vom selben, aber beliebigen Typ sind. – Adowrath

0

Da B, C und D sind Unterklassen von A, und Sie wollen etwas mit diesen Klassen tun, ich wouldn Verwenden Sie nicht den Operator instanceOf. Dieser ist nur nützlich, wenn es keinen anderen Weg gibt.

Sie könnten besser die Super-Methoden und/oder Variablen überschreiben, so dass Sie alle Objekte gleich verwenden können, hart, sie werden etwas anderes tun (zum Beispiel das Drucken eines eigenen Typs).

1

Etwas wie folgt aus:

if(classA.getClass().getName().equals(classB.getClass().getName())) 
    <do something> 
Verwandte Themen