Java-Instanz des Operators

1. Einleitung

In diesem kurzen Tutorial lernen wir die Instanz des Operators in Java kennen.

2. Was ist die Instanz des Operators?

instanceof ist ein binärer Operator, mit dem getestet wird, ob ein Objekt von einem bestimmten Typ ist. Das Ergebnis der Operation ist entweder wahr oder falsch . Es wird auch als Typvergleichsoperator bezeichnet, da es die Instanz mit dem Typ vergleicht.

Vor dem Umwandeln eines unbekannten Objekts sollte immer die Instanz der Prüfung verwendet werden. Auf diese Weise können Sie ClassCastException zur Laufzeit vermeiden .

Die Instanceof grundlegende Syntax des Operators ist:

(object) instanceof (type)

Sehen wir uns ein grundlegendes Beispiel für die Instanz des Operators an. Zuerst müssen wir eine Klasse erstellen Runde :

public class Round { // implementation details }

Als nächstes wollen wir eine Klasse erstellen Ring , die sich Runde :

public class Ring extends Round { // implementation details }

Wir können instanceof verwenden , um zu überprüfen, ob eine Instanz von Ring vom Typ Round ist :

@Test public void givenWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); Assert.assertTrue(ring instanceof Round); }

3. Wie funktioniert die Instanz des Operators?

Die Instanz des Operators arbeitet nach dem Prinzip der is-a-Beziehung . Das Konzept einer is-a-Beziehung basiert auf Klassenvererbung oder Schnittstellenimplementierung.

Um dies zu demonstrieren, erstellen wir eine Shape- Oberfläche:

public interface Shape { // implementation details }

Lassen Sie uns auch eine Klasse erstellen , Kreis , dass Geräte die Form - Schnittstelle und auch die sich Round - Klasse:

public class Circle extends Round implements Shape { // implementation details }

Die Instanz des Ergebnisses ist wahr, wenn das Objekt eine Instanz vom Typ ist:

@Test public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Circle); }

Es ist auch wahr, wenn das Objekt eine Instanz einer Unterklasse des Typs ist:

@Test public void giveWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Round); }

Wenn der Typ eine Schnittstelle ist, wird true zurückgegeben, wenn das Objekt die Schnittstelle implementiert:

@Test public void givenWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Shape); }

Der Operator instanceof kann nicht verwendet werden, wenn keine Beziehung zwischen dem zu vergleichenden Objekt und dem Typ besteht, mit dem es verglichen wird.

Lassen Sie uns eine neue Klasse erstellen Dreieck , dass Geräte - Form , aber hat keine Beziehung zu Kreis :

public class Triangle implements Shape { // implementation details }

Wenn wir nun instanceof verwenden , um zu überprüfen, ob ein Kreis eine Instanz von Triangle ist :

@Test public void givenWhenComparingClassInDiffHierarchy_thenCompilationError() { Circle circle = new Circle(); Assert.assertFalse(circle instanceof Triangle); }

Wir erhalten einen Kompilierungsfehler, da keine Beziehung zwischen den Klassen Circle und Triangle besteht :

java.lang.Error: Unresolved compilation problem: Incompatible conditional operand types Circle and Triangle

4. Verwenden Sie instanceof mit dem Objekttyp

In Java erbt jede Klasse implizit von der Object- Klasse. Daher wird die Verwendung des Operators instanceof mit dem Objekttyp immer als wahr ausgewertet :

@Test public void givenWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); Assert.assertTrue(thread instanceof Object); }

5. Verwenden der Instanz des Operators Wenn ein Objekt null ist

Wenn wir den Operator instanceof für ein Objekt verwenden, das null ist , wird false zurückgegeben . Außerdem ist keine Nullprüfung erforderlich, wenn eine Instanz des Operators verwendet wird.

@Test public void givenWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; Assert.assertFalse(circle instanceof Round); }

6. Instanz von und Generika

Instanztests und Casts hängen von der Überprüfung der Typinformationen zur Laufzeit ab. Daher können wir instanceof nicht zusammen mit gelöschten generischen Typen verwenden .

Zum Beispiel, wenn wir versuchen, das folgende Snippet zu kompilieren:

public static  void sort(List collection) { if (collection instanceof List) { // sort strings differently } // omitted }

Dann erhalten wir diesen Kompilierungsfehler:

error: illegal generic type for instanceof if (collection instanceof List) { ^

Technisch gesehen dürfen wir nur instanceof zusammen mit reified verwendengibt Java ein. Ein Typ wird geändert, wenn seine Typinformationen zur Laufzeit vorhanden sind.

Die reifizierten Typen in Java sind wie folgt:

  • Primitive Typen wie int
  • Nicht generische Klassen und Schnittstellen wie String oder Random
  • Generische Typen, bei denen alle Typen unbegrenzte Platzhalter wie Set oder Map sind
  • Raw-Typen wie List oder HashMap
  • Arrays anderer reifizierbarer Typen wie String [], List [] oder Map []

Da generische Typparameter nicht geändert werden, können wir sie auch nicht verwenden:

public static  boolean isOfType(Object input) { return input instanceof T; // won't compile }

Es ist jedoch möglich, gegen etwas wie List zu testen :

if (collection instanceof List) { // do something }

7. Fazit

In diesem Tutorial haben wir etwas über die Instanz des Operators und dessen Verwendung gelernt . Die vollständigen Codebeispiele sind auf GitHub verfügbar.