2010-11-28 15 views
47

Gibt es eine einfache Möglichkeit zu überprüfen, ob ein Objekt zu einer bestimmten Klasse gehört? Ich könnte zum BeispielPrüfen, ob ein Objekt zu einer Klasse in Java gehört

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

tun, aber dies erfordert jedes Mal ein neues Objekt instanziieren, nur um es zu verwerfen. Gibt es eine bessere Möglichkeit zu überprüfen, ob "a" zur Klasse "MyClass" gehört?

Antwort

123

Die instanceof Schlüsselwort, wie die anderen Antworten beschrieben, in der Regel ist das, was Sie wollen. Beachten Sie, dass instanceoftrue auch für Superklassen zurückgibt.

Wenn Sie sehen möchten, ob ein Objekt eine direkte Instanz einer Klasse ist, können Sie die Klasse vergleichen. Sie können das Klassenobjekt einer Instanz über getClass() abrufen. Und Sie können über ClassName.class statisch auf eine bestimmte Klasse zugreifen.

So zum Beispiel:

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

Im obigen Beispiel ist die Bedingung wahr, wenn a eine Instanz von X ist, aber nicht, wenn a ist eine Instanz einer Unterklasse von X.

Zum Vergleich:

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

Im instanceof Beispiel ist die Bedingung erfüllt, wenn a eine Instanz von X ist, oder wenn a ist eine Instanz einer Unterklasse von X.

Die meiste Zeit, instanceof ist richtig.

4

Versuchen Sie den Operator instanceof.

15

Verwenden Sie die instanceof Betreiber:

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

Wenn Sie jemals diese dynamisch tun müssen, können Sie die folgende verwenden können,

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

wo clazz eine Instanz von Class ist.

+0

oder besser noch, verwenden IsAssignableFrom (Class):

void someMethod(Object a, Class<A> aClass) { if (aClass.isInstance(a)) { A casted = aClass.cast(a); ... } } 

Sie dann die Methode als aufrufen – Chii

+1

@Chii Aber dann müssen Sie 'getClass' erneut auf' a'aufrufen, was der Backhand versucht zu vermeiden. – gdejohn

+0

nein - alles, was Sie brauchen, sind Verweise auf die Klassen, die Sie vergleichen möchten - a.getClass(). IsAssignableFrom (MyClass.class) oder andersherum. – Chii

3

Ich stimme der bereits erwähnten Verwendung von instanceof zu.

Ein weiterer Vorteil instanceof der Verwendung ist, dass, wenn sie mit einer null Referenz verwendet instanceof von false zurück, während a.getClass() ein NullPointerException werfen würde.

2

Der üblicher Weg wäre:

if (a instanceof A) 

Allerdings gibt es Fälle, wenn Sie dies nicht tun, wie wenn A in einem generischen Argumente.

Aufgrund Java Typ Löschung, wird Folgendes nicht kompilieren:

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

und folgendes funktioniert nicht (und wird eine unchecked cast Warnung erzeugen):

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

Sie können‘ t wird zur Laufzeit in A umgewandelt, da zur Laufzeit A im Wesentlichen Object ist.

Die Lösungen für solche Fälle ist eine Class anstelle des generischen Argument zu verwenden:

someMethod(myInstance, MyClass.class); 
someMethod(myInstance, OtherClass.class); 
Verwandte Themen