ビジネスチャット、Web会議、ファイル共有、スケジュール管理を統合したグループウェア。IP Messenger 互換。

Java 変数の型を instanceof で確認する

変数の型を確認する

Java で変数の型を確認するサンプルプログラムを紹介します。

Java は型を明示的に宣言する静的型付け言語なので、そこまで型を確認する機会はありません。しかし、継承オブジェクトを使用する場合は型の確認が必要になることがあります。

Java で型の確認をするには「instanceof」演算子を使います。

変数名 instanceof クラス名
変数名 instanceof インターフェース名

instanceof の右辺にクラス名、またはインターフェース名が指定できます。instanceof の戻り値は booleanで、true なら変数は指定したクラスかインターフェース、ということになります。

サンプルプログラム

まずは最もシンプルなパターン。変数 i が Integer であれば true そうでなければ false を返します。

サンプルコード

public static void integerSample() {
    Integer i = 100;
    boolean result = i instanceof Integer;
    System.out.println(result);
}
出力結果:
true

変数 i は Integer なので、結果は true になります。しかし、これでは当たり前すぎて instanceof がなんのためにあるか分かないので、もう少し複雑にします。

instanceof の効果的な使い方

instanceof の効果的な使い方の一つに、その変数がどの子クラスなのかを判定する場合があります。

サンプルコード

// 動物クラスと、動物クラスを継承したDogクラスとCatクラスを作成
class Animal {} 
class Dog extends Animal {}
class Cat extends Animal {}

// メイン処理
public class Main {
    public static void main(String[] args) {
        instanceofSample();
    }
    
    static void instanceofSample() {
        // 犬と遊ぶ
        Animal dog = new Dog();
        play(dog);
        // 猫と遊ぶ
        Animal cat = new Cat();
        play(cat);
    }
    
    // 動物と遊ぶ
    static void play(Animal animal) {
        // このメソッド内では animal が dog か cat かわからないので、instanceof で判定する
        if (animal instanceof Dog) {
            System.out.println("お散歩する");
        } else {
            System.out.println("猫じゃらしで遊ぶ");
        }
    }
}
出力結果:
お散歩する
猫じゃらしで遊ぶ

play メソッド内では引数に渡された animal が dog か cat か分からないのがポイントです。

instanceof ではスーパークラス(Animal)の中に入っているサブクラスのインスタンス(DogまたはCat)ともチェックできるので、こんな使い方もできるんですね。

特定のインターフェースが実装されているか確認する

instanceof の対象となる変数に、ある特定のインターフェースが実装されているか確認できます。

例えばこのような使い方ができます。

サンプルコード

// 鈴木さんだけ車を持っている
interface Car {}
class Sato {}
class Suzuki implements Car {}

public class Main {
    public static void main(String[] args) throws Exception {
        instanceofSample();
    }
    
    static void instanceofSample() {
        // 佐藤さんは買い物にでかける
        Sato sato = new Sato();
        goShopping(sato);
        // 鈴木さんも買い物に出かける
        Suzuki suzuki = new Suzuki();
        goShopping(suzuki);
    }
    
    // 買い物に行く
    static void goShopping(Object human) {
        //車を持っているか(Carが実装されているか)確認
        if (human instanceof Car) {
            System.out.println("車で行く");
        } else {
            System.out.println("歩いて行く");
        }
    }
}
出力結果:
結果
歩いて行く
車で行く

Car が実装されている場合とそうでない場合で、処理が分岐しているのが分かります。