Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Java辞典

  1. トップページ
  2. Java辞典
  3. Objects.toString() / getClass() / instanceof

Objects.toString() / getClass() / instanceof

オブジェクトの実際の型を実行時に確認するための演算子・メソッドです。『instanceof』で型チェックを行い、『getClass()』で実際のクラスを取得します。Java 16以降はパターンマッチングでキャストを簡略化できます。

構文
// instanceofで型を確認します(trueなら指定型またはそのサブクラス)。
boolean result = オブジェクト instanceof 型名;

// パターンマッチング instanceof(Java 16以降): チェックとキャストを同時に行います。
if (オブジェクト instanceof 型名 変数名) {
    // 変数名を型名として直接使用できます。
}

// 実際のクラスオブジェクトを取得します。
Class<?> clazz = オブジェクト.getClass();

// クラスの単純名(パッケージなし)を取得します。
String simpleName = オブジェクト.getClass().getSimpleName();

// クラスの完全修飾名を取得します。
String fullName = オブジェクト.getClass().getName();
メソッド・演算子一覧
メソッド / 演算子概要
instanceof 型名オブジェクトが指定した型またはそのサブクラスのインスタンスであれば true を返します。null に対しては常に false を返します。
instanceof 型名 変数名Java 16以降のパターンマッチング。条件が真の場合に変数に自動キャストされた値を束縛します。
getClass()実行時の実際のクラスを Class<?> オブジェクトとして返します。
getClass().getSimpleName()クラスの単純名(パッケージ部分を除いた名前)を返します。
getClass().getName()完全修飾クラス名(例: java.lang.String)を返します。
getClass().getSuperclass()直接の親クラスを返します。
getClass().getInterfaces()実装しているインターフェースの配列を返します。
サンプルコード
// instanceofで型チェックを行います。
Object obj = "Hello, Java!";
System.out.println(obj instanceof String);  // 『true』と出力されます。
System.out.println(obj instanceof Integer); // 『false』と出力されます。
System.out.println(null instanceof String); // 『false』と出力されます(nullはfalse)。

// 従来のinstanceof + キャストの書き方です。
if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.toUpperCase()); // 『HELLO, JAVA!』と出力されます。
}

// パターンマッチinginstanceof(Java 16以降)。
if (obj instanceof String s) {
    // キャスト不要で直接sとして使用できます。
    System.out.println(s.length()); // 『12』と出力されます。
}

// getClass() でクラス情報を取得します。
Object num = 42;
System.out.println(num.getClass().getSimpleName()); // 『Integer』と出力されます。
System.out.println(num.getClass().getName());        // 『java.lang.Integer』と出力されます。

// ポリモーフィズムとinstanceofを組み合わせます。
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

Animal a = new Dog();
System.out.println(a instanceof Animal); // 『true』と出力されます。
System.out.println(a instanceof Dog);    // 『true』と出力されます。
System.out.println(a instanceof Cat);    // 『false』と出力されます。

// switch文でパターンマッチング(Java 21以降)。
Object value = 3.14;
String desc = switch (value) {
    case Integer i -> "整数: " + i;
    case Double d  -> "小数: " + d;
    case String s  -> "文字列: " + s;
    default        -> "その他";
};
System.out.println(desc); // 『小数: 3.14』と出力されます。
概要

『instanceof』はポリモーフィズムを使ったコードでオブジェクトの実際の型を確認するときに使います。Java 16以降のパターンマッチング構文(instanceof 型名 変数名)を使うと、チェックとキャストを1行で書けて可読性が上がります。

『getClass()』は継承関係を無視して実際のクラスだけを返します。継承を考慮した型チェックには instanceof を使い、厳密に同じクラスかどうかを確認したい場合は getClass() == 型名.class を使ってください。

Objectsクラスのユーティリティメソッドについては『Objects.equals() / Objects.toString() / Objects.requireNonNull()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。