Wofür wird der instanceof
Operator verwendet? Ich habe Sachen wie gesehen
if (source instanceof Button) {
//...
} else {
//...
}
Aber nichts davon ergab für mich einen Sinn. Ich habe meine Nachforschungen angestellt, aber nur Beispiele ohne Erklärungen gefunden.
java
instanceof
Ben
quelle
quelle
instanceof
Überschreibenequals
?Antworten:
instanceof
Das Schlüsselwort ist ein binärer Operator , mit dem getestet wird, ob ein Objekt (eine Instanz) ein Subtyp eines bestimmten Typs ist.Vorstellen:
Stellen Sie sich ein
dog
Objekt vor , das erstellt wurde mitObject dog = new Dog()
:Mit
Object animal = new Animal();
,weil
Animal
ist ein Supertyp vonDog
und möglicherweise weniger "verfeinert".Und,
Dies liegt daran, dass
Dog
es sich weder um einen Subtyp noch um einen SupertypCat
handelt und dieser auch nicht implementiert wird.Beachten Sie, dass die oben verwendete Variable
dog
vom Typ istObject
. Dies soll zeigen, dassinstanceof
es sich um eine Laufzeitoperation handelt , und bringt uns zu einem Anwendungsfall: Je nach Objekttyp zur Laufzeit unterschiedlich zu reagieren .Dinge zu beachten:
expressionThatIsNull instanceof T
ist für alle Typen falschT
.Viel Spaß beim Codieren.
quelle
Object dog = new Dog(); System.out.println(dog instanceof Cat);
. Dies kompiliert gut und drucktfalse
. Der Compiler darf zur Kompilierungszeit nicht feststellen, dass esdog
sich nicht um eine Katze handeln kann (gemäß den Regeln in der JLS)boolean b = "foo" instanceof Integer;
Object indirect = ...; if (indirect instanceof Something)
. Es geht nicht darum,if (literal instanceof Something)
wie Sie annehmen.Object dog
Teil übersprungen haben . Mein Fehler!dog instanceof Cat // does not even compile!
(weil es eine Klasse ist). WennCat
eine Schnittstelle wäre, würde sie kompiliert.Es ist ein Operator, der true zurückgibt, wenn die linke Seite des Ausdrucks eine Instanz des Klassennamens auf der rechten Seite ist.
Denken Sie so darüber nach. Angenommen, alle Häuser in Ihrem Block wurden nach denselben Bauplänen gebaut. Zehn Häuser (Objekte), ein Satz Blaupausen (Klassendefinition).
instanceof
ist ein nützliches Werkzeug, wenn Sie eine Sammlung von Objekten haben und nicht sicher sind, was sie sind. Angenommen, Sie haben eine Sammlung von Steuerelementen in einem Formular. Sie möchten den aktivierten Status aller vorhandenen Kontrollkästchen lesen, können jedoch kein einfaches altes Objekt nach dem aktivierten Status fragen. Stattdessen würden Sie sehen, ob jedes Objekt ein Kontrollkästchen ist, und wenn ja, wandeln Sie es in ein Kontrollkästchen um und überprüfen Sie seine Eigenschaften.quelle
instanceof
kann das Downcasting sicher machen.Wie auf dieser Seite beschrieben :
Ich hoffe das hilft!
quelle
Mit diesem Operator können Sie den Typ eines Objekts bestimmen. Es gibt einen
boolean
Wert zurück.Beispielsweise
Die Ausgabe ist:
quelle
Wenn
source
es sich um eineobject
Variable handelt,instanceof
können Sie überprüfen, ob es sich um eine Variable handeltButton
oder nicht.quelle
Wie in anderen Antworten erwähnt, besteht die kanonische typische Verwendung von
instanceof
darin, zu überprüfen, ob sich ein Bezeichner auf einen spezifischeren Typ bezieht. Beispiel:Beachten Sie jedoch, dass der Typ des linken Ausdrucks ein übergeordneter Typ des rechten Ausdrucks sein muss (siehe JLS 15.20.2 und Java Puzzlers, Nr. 50, S. 114 ). Folgendes kann beispielsweise nicht kompiliert werden:
Dies kann nicht mit der Nachricht kompiliert werden:
Da
Test
ist keine Elternklasse vonString
. OTOH, dies kompiliert perfekt und drucktfalse
wie erwartet:quelle
quelle
Kann als Abkürzung für die Gleichstellungsprüfung verwendet werden.
quelle
Die meisten Leute haben das "Was" dieser Frage richtig erklärt, aber niemand hat "Wie" richtig erklärt.
Hier ist eine einfache Illustration:
Ausgänge:
Der Grund für den Compilerfehler beim Vergleich
s
mit StringBuffer wird in den Dokumenten ausführlich erläutert :Dies impliziert, dass die LHS entweder eine Instanz von RHS oder einer Klasse sein muss, die entweder RHS implementiert oder RHS erweitert.
Wie verwende ich dann instanceof?
Da jede Klasse Object erweitert, funktioniert die Typumwandlung von LHS zu Objekt immer zu Ihren Gunsten:
Ausgänge:
quelle
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true
, seit wir s in Object typisiert haben?http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
quelle
Die Instanz des Schlüsselworts ist hilfreich, wenn Sie die Instanz eines bestimmten Objekts kennen möchten.
Angenommen, Sie sind eine Wurfausnahme. Wenn Sie einen Fang haben, führen Sie eine benutzerdefinierte Summenoperation aus und fahren Sie dann erneut gemäß Ihrer Logik fort (Würfe oder Protokoll usw.).
Beispiel: 1) Der Benutzer hat eine benutzerdefinierte Ausnahme "InvalidExtensionsException" erstellt und diese gemäß der Logik ausgelöst
2) Jetzt im catch-Block catch (Ausnahme e) {Summenlogik ausführen, wenn der Ausnahmetyp "InvalidExtensionsException" ist.
3) Wenn Sie die Instanz nicht überprüfen und der Ausnahmetyp eine Nullzeigerausnahme ist, wird Ihr Code unterbrochen.
Ihre Logik sollte sich also innerhalb der Instanz von if befinden (e Instanz von InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }}
Das obige Beispiel ist eine falsche Codierungspraxis. Dieses Beispiel hilft Ihnen jedoch, die Verwendung der Instanz davon zu verstehen.
quelle
Beste Erklärung ist jls . Versuchen Sie immer zu überprüfen, was die Quelle sagt. Dort erhalten Sie die beste Antwort und vieles mehr. Einige Teile hier reproduzieren:
quelle
Mit dem Java-
instanceof
Operator wird getestet, ob das Objekt eine Instanz des angegebenen Typs ist (Klasse oder Unterklasse oder Schnittstelle).Die Instanz von in Java wird auch als Typ bezeichnet,
comparison operator
da sie die Instanz mit dem Typ vergleicht. Es gibt entwedertrue
oder zurückfalse
. Wenn wir deninstanceof
Operator mit einer Variablen anwenden, die einennull
Wert hat, wird er zurückgegebenfalse
.Ab JDK 14+, das JEP 305 enthält , können wir auch "Pattern Matching" für durchführen
instanceof
Muster testen grundsätzlich, ob ein Wert einen bestimmten Typ hat, und können Informationen aus dem Wert extrahieren, wenn er den passenden Typ hat. Der Mustervergleich ermöglicht einen klareren und effizienteren Ausdruck der allgemeinen Logik in einem System, nämlich das bedingte Entfernen von Komponenten aus Objekten.
Vor Java 14
Java 14-Verbesserungen
Wir können auch die Typprüfung und andere Bedingungen miteinander kombinieren
Die Verwendung von Pattern Matching in
instanceof
sollte die Gesamtzahl der expliziten Casts in Java-Programmen reduzieren.PS :
instanceOf
stimmt nur überein, wenn das Objekt nicht null ist, dann kann nur es zugewiesen werdenstr
.quelle
quelle
Sehr einfaches Codebeispiel:
Sei hier vorsichtig. Wenn im obigen Beispiel Klasse1 Objekt ist, ist der erste Vergleich immer wahr. Also, genau wie mit Ausnahmen, ist die hierarchische Reihenfolge wichtig!
quelle
Sie können Map verwenden, um eine höhere Abstraktion für eine Instanz von zu erstellen
Wenn Sie dann eine solche Karte haben, fügen Sie ihr eine Aktion hinzu:
Wenn Sie dann ein Objekt vom unbekannten Typ haben, können Sie eine bestimmte Aktion von dieser Karte erhalten:
quelle
Mit dem Operator instanceof wird überprüft, ob das Objekt eine Instanz des angegebenen Typs ist. (Klasse oder Unterklasse oder Schnittstelle).
Die Instanz von wird auch als Typvergleichsoperator bezeichnet, da sie die Instanz mit dem Typ vergleicht. Es wird entweder wahr oder falsch zurückgegeben.
Wenn wir den Operator instanceof auf eine Variable mit dem Wert null anwenden, wird false zurückgegeben.
quelle