Java instanceofオペレーター

1. 前書き

このクイックチュートリアルでは、Javaの__instanceof ___operatorについて学習します。

2. instanceof Operatorとは何ですか?

  • instanceof is aオブジェクトが特定のタイプかどうかをテストするために使用されるバイナリ演算子。 操作の結果は、true_または_false *のいずれかです。 インスタンスとタイプを比較するため、タイプ比較演算子とも呼ばれます。

    不明なオブジェクトをlink:/java-type-casting[casting]する前に、_instanceof_チェックを常に使用する必要があります。 これにより、実行時に_ ClassCastException _を回避できます。
    _instanceof_演算子の基本構文は次のとおりです。
(object) instanceof (type)
__instanceof ___operatorの基本的な例を見てみましょう。 最初に、クラス_Round_を作成しましょう。
public class Round {
    // implementation details
}
次に、_Round_を拡張するクラス_Ring_を作成します。
public class Ring extends Round {
    // implementation details
}
_instanceof_を使用して、_Ring_のインスタンスが_Round_型であるかどうかを確認できます。
@Test
public void givenWhenInstanceIsCorrect_thenReturnTrue() {
    Ring ring = new Ring();
    Assert.assertTrue(ring instanceof Round);
}

3. instanceof Operatorはどのように機能しますか?

  • instanceof operatorは、is-a関係の原則に基づいて動作します*。 is-a関係の概念は、クラスinheritanceまたはインターフェースの実装に基づいています。

    これを実証するために、_Shape_インターフェースを作成しましょう。
public interface Shape {
    // implementation details
}
また、_Shape_インターフェイスを実装し、_Round_クラスを拡張するクラス_Circle_を作成しましょう。
public class Circle extends Round implements Shape {
    // implementation details
}
*オブジェクトがタイプのインスタンスである場合、_instanceof_の結果は_true_になります*
@Test
public void givenWhenObjectIsInstanceOfType_thenReturnTrue() {
    Circle circle = new Circle();
    Assert.assertTrue(circle instanceof Circle);
}
*オブジェクトが次のタイプのサブクラスのインスタンスである場合も_true_になります。*
@Test
public void giveWhenInstanceIsOfSubtype_thenReturnTrue() {
    Circle circle = new Circle();
    Assert.assertTrue(circle instanceof Round);
}
*タイプがインターフェースの場合、オブジェクトがインターフェースを実装している場合、_true_を返します:*
@Test
public void givenWhenTypeIsInterface_thenReturnTrue() {
    Circle circle = new Circle();
    Assert.assertTrue(circle instanceof Shape);
}
  • _instanceof_演算子は、比較対象のオブジェクトと比較対象のオブジェクトの間に関係がない場合は使用できません。*

    __Shape ___を実装するが_Circle_とは関係のない新しいクラス_Triangle_を作成しましょう。
public class Triangle implements Shape {
    // implementation details
}
_instanceof_を使用して、_Circle_が_Triangle_のインスタンスであるかどうかを確認する場合:
@Test
public void givenWhenComparingClassInDiffHierarchy_thenCompilationError() {
    Circle circle = new Circle();
    Assert.assertFalse(circle instanceof Triangle);
}
_Circle_クラスと_Triangle_クラスの間に関係がないため、コンパイルエラーが発生します。
java.lang.Error: Unresolved compilation problem:
  Incompatible conditional operand types Circle and Triangle

4. _Object_型で_instanceof_を使用する

Javaでは、すべてのクラスが暗黙的に_Object_クラスを継承します。 したがって、_Object_型で_instanceof_演算子を使用すると、常に_true_に評価されます。
@Test
public void givenWhenTypeIsOfObjectType_thenReturnTrue() {
    Thread thread = new Thread();
    Assert.assertTrue(thread instanceof Object);
}

5. _instanceof_演算子の使用オブジェクトが_null_の場合

_null_であるオブジェクトでthe__ instanceof__演算子を使用すると、_false_を返します。 また、_instanceof_ operatorを使用する場合、nullチェックは必要ありません。
@Test
public void givenWhenInstanceValueIsNull_thenReturnFalse() {
    Circle circle = null;
    Assert.assertFalse(circle instanceof Round);
}

6. 結論

このチュートリアルでは、_instanceof_演算子とその使用方法について学習しました。 完全なコードサンプルは、https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-lang-operators [GitHub]で入手できます。