変数の型を確認する
Java で変数の型を確認するサンプルプログラムを紹介します。
Java は型を明示的に宣言する静的型付け言語なので、そこまで型を確認する機会はありません。しかし、継承オブジェクトを使用する場合は型の確認が必要になることがあります。
Java で型の確認をするには instanceof 演算子を使い、次の通りクラスやインターフェースに対し if 文などで評価できます。
変数 instanceof クラス
変数 instanceof インターフェース
instanceof の右辺にクラス名、またはインターフェース名が指定できます。instanceof の戻り値は booleanで、true なら変数は指定したクラスかインターフェース、ということになります。
Chat&Messenger は、ビジネスチャット、Web会議、ファイル共有、スケジュール管理、文書管理、会議室予約、勤怠管理を使いやすく統合したグループウェアです。企業向けにセキュリティも万全で、無料で利用できます!
サンプルプログラム
まずは最もシンプルなパターン。変数 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 の効果的な使い方の一つに、その変数がどの子クラスなのかを判定する場合があります。
サンプルコード
サンプルコードでは動物クラス Animal と、動物クラスを継承した Dog クラス、Cat クラスを作成し、インスタンスを作成後に、play メソッド内で変数を instanceof で判定しコンソール出力を分岐しています。
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) {
if (animal instanceof Dog) {
System.out.println("お散歩する");
} else {
System.out.println("猫じゃらしで遊ぶ");
}
}
}
出力結果
お散歩する
猫じゃらしで遊ぶ
play メソッド内では引数に渡された animal が dog か cat か分からないのがポイントです。
instanceof ではスーパークラス(Animal)の中に入っているサブクラスのインスタンス(DogまたはCat)ともチェックできるので、こんな使い方もできるんですね。
特定のインターフェースが実装されているか確認する
instanceof の対象となる変数に、ある特定のインターフェースが実装されているか確認できます。例えばこのような使い方ができます。
サンプルコード
次のサンプルコードでは、佐藤さん、鈴木さんクラスを作成し、鈴木さんだけが車を持っている想定で、インターフェース Car を implements しています。goShopping() メソッドは買い物に行く処理を仮定していますが、Car を implements しているか、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) {
if (human instanceof Car) {
System.out.println("車で行く");
} else {
System.out.println("歩いて行く");
}
}
}
出力結果:
歩いて行く
車で行く
Car が実装されている場合とそうでない場合で、処理が分岐しているのが分かります。