【Java】 instanceof 演算子 / getClass()

はじめに

 * 変数の型やクラスを調べる術を記録しておく

[1] instanceof演算子

x instanceof y

 => 「xがyと同じクラス」か「yのサブクラスである場合」にtrueを返す。

注意1 : null時の挙動について

 * nullの場合、たとえ型が一致してしていてもtrueにならない

サンプル

public static void main(String[] args) {
     String x = null;
     if(x instanceof String){
         System.out.println("True? "  + x);
     }
     System.out.println("Done");
}

出力結果

"True? null"が表示されない(nullの場合、たとえ型が一致してしていてもtrueにならない)
Done

注意2 : ジェネリックではコンパイルエラーになる

 * 以下のようなジェネリックの使った場合コンパイルエラーとなる

// コンパイルエラー!!
if (object instanceof T) {
   // 何らかの処理
}

 * 以下の参考文献のように「getClass()」で解決するしかない?
http://etc9.hatenablog.com/entry/20090829/1251568800

注意3 : コレクションは、<?> を使う

 * コレクションは、「list instanceof List<?>」「map instanceof Map<?, ?>」などで判定する

サンプル

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Main {
   public static void main(String[] args) {
      List<String> list = new ArrayList<>();
      if (list instanceof List<?>) {
         System.out.println("List");
      }
      Map<String, Integer> map = new LinkedHashMap<>();
      if (map instanceof Map<?, ?>) {
         System.out.println("Map");
      }
      System.out.println("Done");
   }
}

出力結果

List
Map
Done

[2] getClass()

 * 変数のクラス名を取得できる

サンプル

public static void main(String[] args) {
   String x = "Test";
   System.out.println("x.getClass() : " + x.getClass());
   System.out.println("Done");
}

出力結果

package名も含めて表示される
Done

[3] その他

継承しているかどうかを判定

サンプル

public static boolean isImplemented(
      Class<?> interfaceClass, Class<?> targetClass) {
   
   if (interfaceClass.equals(targetClass) ||
         interfaceClass.isInterface() && interfaceClass.isAssignableFrom(targetClass)) {
      return true;
   }
   return false;
}


関連記事

応用例

スタック情報の取得

http://blogs.yahoo.co.jp/dk521123/33033523.html

.NET

C#】IS演算子 / AS演算子 / GetType().Name / Typeof ~キャスト関連の処理~

http://blogs.yahoo.co.jp/dk521123/19117857.html