はじめに
* 変数の型やクラスを調べる術を記録しておく
[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
* 以下のようなジェネリックの使った場合コンパイルエラーとなる
// コンパイルエラー!!
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;
}