😺
【Java】instanceof パターン・マッチングについて
instanceofとは?
オブジェクトが特定のクラスやインターフェースのインスタンスかどうかを調べるためのキーワード
基本構文
オブジェクトが指定したクラス(またはそのサブクラス)のインスタンスであればtrueを返し、それ以外なら false を返す
オブジェクト instanceof クラス名
使用例
インスタンスがどのクラスなのかチェック
スーパークラス:Animal
package instanceofTest;
public class Dog extends Animal {
}
サブクラス:Dog
package instanceofTest;
public class Dog extends Animal {
}
package instanceofTest;
public class InstanceofTest {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = new Dog();
System.out.println(animal instanceof Animal); // true
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Animal); // true(DogはAnimalを継承している)
System.out.println(animal instanceof Dog); // false(AnimalはDogではない)
}
}
<出力例>

nullの場合
nullに対してinstanceofを使うと、falseになる
※Dogクラスは上記のものを使用
package instanceofTest;
public class InstanceofTest2 {
public static void main(String[] args) {
Dog dog = null;
System.out.println(dog instanceof Dog); // false
}
}

インターフェースをチェック
インターフェースを実装しているかどうかを判定
bird は Flyable インターフェースを実装
package instanceofTest;
interface Flyable {
}
class Bird implements Flyable {
}
public class InstanceofTest3 {
public static void main(String[] args) {
Bird bird = new Bird();
//bird は Flyable インターフェースを実装している
System.out.println(bird instanceof Flyable); // true
}
}
型キャストの前に instanceof をチェックすることでClassCastExceptionを防ぐことが出来た。
Animal animal = new Dog();
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 安全にキャストできる
}
instanceofパターン・マッチングとは?
Java16からinstanceofのパターン・マッチングが導入され、型チェックをしつつ簡潔にコードが書けるようになった
使用例
- instanceofの判定と型キャストを1行で出来る
- if のブロック内だけでstrを使用することが出来る
package instanceofTest;
public class PatternMatchingTest {
public static void main(String[] args) {
Object obj = "Hello, World!";
if (obj instanceof String str) {
System.out.println("文字列の長さ: " + str.length());
} else {
System.out.println("文字列ではありません");
}
}
}
<出力例>

Udemyで講座を公開中!
X(旧Twitter)
Zenn 本
Youtube
Discussion
注意点に書かれている2点は、オラクル社の解説と異なるように思えますが、いかがでしょうか。
ご指摘ありがとうございます!
確認しますため、いったん非表示にしました。