Gibt es so etwas wie instanceOf (Klasse <?> C) in Java?

87

Ich möchte überprüfen, ob ein Objekt oeine Instanz der Klasse Coder einer Unterklasse von ist C.

Zum Beispiel, wenn ich pvon Klasse Pointbin, möchte ich x.instanceOf(Point.class)sein trueund auch x.instanceOf(Object.class)sein true.

Ich möchte, dass es auch für primitive Box-Typen funktioniert. Zum Beispiel, wenn xist ein Integerdann x.instanceOf(Integer.class)sollte sein true.

Gibt es so etwas? Wenn nicht, wie kann ich eine solche Methode implementieren?

Snakile
quelle
Der Umgang mit Boxed Classes ist ein wenig chaotisch
dfa

Antworten:

171

Class.isInstance macht was Sie wollen.

if (Point.class.isInstance(someObj)){
    ...
}

Natürlich sollten Sie es nicht verwenden, wenn Sie es instanceofstattdessen verwenden könnten , aber für Reflexionsszenarien ist es oft nützlich.

gustafc
quelle
6
@Ahamed es ist wahrscheinlich langsamer, aber was schlimmer ist, ist es schwerer zu verstehen! Wenn es einen sehr einfachen Weg gibt, etwas zu tun - wie if (a instanceof Point)-, aber Sie es auf eine kompliziertere Art und Weise tun, muss jeder, der den Code liest, denken: "Oh, es muss einen Grund dafür geben, dass dies auf die harte Tour gemacht wird." Wechseln Sie dann zu den Dokumenten, um herauszufinden, wie sich diese Class.isInstanceunterscheiden instanceof. Sie verschwenden die Zeit Ihrer Kollegen.
Gustafc
20

Ich möchte überprüfen, ob ein Objekt o eine Instanz der Klasse c oder einer Unterklasse von c ist. Wenn zum Beispiel p zur Klasse Point gehört, möchte ich x.instanceOf (Point.class)

Ähm ... Was? Was sind o, p und x?

Ich möchte, dass es auch für primitive Typen funktioniert. Wenn x beispielsweise eine Ganzzahl ist, sollten x.instanceOf (Integer.class) und auch x.instanceOf (Object.class) true sein.

Nein, es sollte nicht einmal kompiliert werden. Grundelemente sind keine Objekte, und Sie können keine Methoden für sie aufrufen.

Wie auch immer, es gibt drei Dinge, von denen eines definitiv das erreichen kann, was Sie wollen (sie unterscheiden sich etwas darin, wo genau die zutreffen:

  • Der instanceofOperator, wenn Sie die Klasse zur Kompilierungszeit kennen.
  • Class.isInstance (), wenn Sie die Klasse eines Objekts mit einer Klasse vergleichen möchten, die zur Kompilierungszeit nicht bekannt ist.
  • Class.isAssignableFrom (), wenn Sie die Zuweisbarkeit für zwei Klassenobjekte überprüfen möchten.
Michael Borgwardt
quelle
9
x instanceof Integer
x instanceof Object

Sie müssen nur die richtige Syntax verwenden

Für primitive Typen muss man das ganz anders machen. Da Sie keine Methoden für sie erstellen können, benötigen Sie eine Klasse, die die Methode beibehält. Anstelle von "x.instanceOf (Integer.Class)" müssen Sie also "MyClassComparer.instanceOf (x, Integer.Class)" oder ähnliches aufrufen. Dies könnte leicht durch Überladen von Methoden implementiert werden, aber ich sehe keinen Fall, in dem diese Funktionalität überhaupt wünschenswert wäre.

Erich Kitzmüller
quelle
4

Tatsächlich gibt es in Java einen booleschen Operator namens instanceof, mit dem bestimmt werden kann, ob ein Objekt eine Instanz einer Klasse, eine Instanz einer Unterklasse oder eine Instanz einer Klasse ist, die eine bestimmte Schnittstelle implementiert.

if(obj instanceof SomeClass) {
    // Do something
}

Das Java-Tutorial enthält ein gutes Beispiel für diesen Operator

Victor Hugo
quelle
1
Sie können instanceof nicht mit primitiven Typen verwenden
dfa
4
Er verwechselte primitive Typen mit Objekten. Bitte lesen Sie ... "Wenn x beispielsweise eine Ganzzahl ist, sollten x.instanceOf (Integer.class) und auch x.instanceOf (Object.class) wahr sein." Schade, dass Sie alle Antworten
abgelehnt haben
Den Vorschlag zur Verwendung des Java-Tutorials unterstützen (sp). Es ist eine gute Referenz zum Erlernen der Sprache.
Luis.espinal
0

Du kannst tun:

if (foo instanceof classNameYouWantToCheck) 
fmsf
quelle
Sie können instanceof nicht mit primitiven Typen verwenden
dfa
Die Klasse sollte nur zeigen, dass er den Klassennamen dort schreiben sollte. Ich werde es beheben
fmsf
0

"Ich möchte, dass es auch für primitive Typen funktioniert. Wenn beispielsweise x eine Ganzzahl ist, sollten x.instanceOf (Integer.class) und auch x.instanceOf (Object.class) wahr sein."

Warum? Primitive Typen und Referenztypen sind völlig getrennt. Ein primitives int ist kein Subtyp von Integer oder Object. Der Typ eines primitiven Werts ist zur Kompilierungszeit immer statisch bekannt, daher macht es keinen Sinn, seinen Typ zu testen. Natürlich können Sie einen primitiven Wert einschließen und dann seinen Typ testen:

(Integer)5 instanceof Integer

Aber worum geht es?

newacct
quelle
-2

Ich denke, Sie sind verwirrt über die Instanz von rohen und generischen Objekten

obj instanceof Class
obj instanceof Class<?> // this is the one you want
Paul Bors
quelle
2
Sie können keine Generika auf der rechten Seite der Instanz des Operators verwenden, da der Typ gelöscht wird.
Matthias
2
Nein, Sie sind verwirrt. Sie müssen den Rohtyp nach verwenden instanceof.
Dawood ibn Kareem