2014-09-21 13 views
18

Meine Methode ruft die Klasse als Parameter ab und ich muss prüfen, ob meine Variablen vom Typ class sind.java - Wie überprüfe ich, ob mein Objekt vom Typ einer bestimmten Klasse ist?

Volvo v1 = new Volvo(); 
Class aClass = v1.getClass(); 
check(aClass); 

innerhalb ich so etwas wie

v2 instanceof aClass ? "True" : "False"); 

aber das doesn tun müssen; t kompilieren.

+0

Sollte nicht der Compiler in der Lage sein, für Sie zu überprüfen? Wie deklarieren Sie Ihre Prüfmethode? –

+0

v2 instanceof ** Klasse **?"Wahr falsch"); – Nabin

+1

Ich rieche hier mögliche Anti-Pattern-Verwendung und frage mich wieder, ob die Verwendung von Generics, um den Typ des Parameters besser zu spezifizieren, eine bessere und sauberere Lösung sein könnte, um das Problem zur ** Kompilierzeit ** nicht zu lösen ** Laufzeit **. –

Antwort

27

Ich denke, Sie wollen aClass.isInstance(v2). Das Schlüsselwort docs say it works the same as the instanceOf. Ich denke, sie können instanceOf nicht als Methodennamen verwenden, da Schlüsselwörter nicht als Methodennamen verwendet werden können.

v2 = ??? 
Volvo v1 = new Volvo(); 
Class aClass = v1.getClass(); 
aClass.isInstance(v2)  // "check(aClass)" 

Oder vielleicht nur ein Klassenliteral verwenden, wenn "Volvo" eine Konstante ist.

v2 = ??? 
Volvo.class.isInstance(v2); 
13
Volvo v = new Volvo(); 
    if (v instanceof Volvo) { 
     System.out.println("I'm boxy, but safe."); 
    } 
+0

Es könnte helfen zu erklären, was das tut/warum es eine gültige Antwort ist. – Whymarrh

1

können Sie auch versuchen:

aClass.isAssignableFrom(v2.getClass()) 

Wo "aClass" eine übergeordnete Klasse von "v2" ist

4

Wie Hovercraft Full Of Aale erwähnt, können Sie in der Regel so vermeiden explizite Methodenaufrufe, indem Sie sich an den Compiler lehnen, um die Überprüfung für Sie durchzuführen. Einige Ansätze:

  • Sie schreiben einen Container einer generisch typisierten Sache. Lassen Sie die Art der Sache T sein, dann Java können Sie dies wie folgt ausdrücken:

    public class MyClass<T> { private T thing; public void setThing(T t) { this.thing = t; } private void check(Class<T> cls) {} // probably not necessary }

    Dann Instanzen MyClass<T> wie folgt erstellen: MyClass<Volvo> m = new MyClass<Volvo>(); oder seit Java 7: MyClass<Volvo> m = new MyClass<>();

  • Sie wirklich tun Ich brauche die Klasse, sagen Sie, weil Sie mit Enum-Typen arbeiten und viele dieser Methoden mit der entsprechenden Klasse parametriert werden:

    public void check(Class<?extends SuperType> validClsAutomaticallyChecked) {}

  • Sie nur ein Objekt eines bestimmten Supertyp müssen die Methode übergeben werden:

    public void pass(SuperType thatSimple) {}

  • Sie müssen nicht, können nicht oder nicht Ihre enthaltenden Klasse nehmen einen Typparameter der Sache machen weitergegeben werden, aber Sie möchten immer noch Generika in Ihrer Methode nutzen. Dies kann nützlich sein, damit der Compiler daraus ableiten kann, dass das, was Sie im Methodenkörper tun, sicher ist. Zum Beispiel möchten Sie vielleicht eine Sammlung von Dingen vom Typ T basierend auf der Art der Sache erstellen, die als Parameter an die Methode übergeben wird.

    public <T> void workWith(T genericallyTypedObject) {}

Verwandte Themen