2019年11月2日
Java で変数の型を確認するサンプルプログラムを紹介します。
Java は型を明示的に宣言する静的型付け言語なので、そこまで型を確認する機会はありません。しかし、継承オブジェクトを使用する場合は型の確認が必要になることがあります。
Java で型の確認をするには「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 の効果的な使い方の一つに、その変数がどの子クラスなのかを判定する場合があります。
// 動物クラスと、動物クラスを継承した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 が実装されている場合とそうでない場合で、処理が分岐しているのが分かります。