Class オブジェクトにある isAssignableFrom がよくわからなくなる
public boolean isAssignableFrom(Class cls)
クラスのメタ情報をあつかう機会ってそんなにないし、使おうと思うとわすれてる
Java Doc は
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter. It returns true if so; otherwise it returns false. If this Class object represents a primitive type, this method returns true if the specified Class parameter is exactly this Class object; otherwise it returns false.
とまぁ、instanceof はオブジェクト(インスタンス)を比較するのに対して、isAssignableFrom() はクラス同士の比較になるのはいいとして、並びが逆なのでアレっ? てなる
いちおう書いておくと、isAssignableFrom() は
class SuperClass { } class SubClass extends SuperClass { } SuperClass.class.isAssignableFrom(SubClass.class); // true SubClass.class.isAssignableFrom(SuperClass.class); // false
instanceof では
SuperClass superObj = new SuperClass(); SubClass subObj = new SubClass(); superObj instanceof SubClass // false subObj instanceof SuperClass // true
ちなみに
instanceof 演算子だとプリミティブ型が指定できない
System.out.println( 0 instanceof Integer ); // syntax error int i = new Integer(0); System.out.println( i instanceof Integer ); // syntax error
けど isAssignableFrom だといける
System.out.println( Integer.class.isAssignableFrom(int.class) );// false System.out.println( int.class.isAssignableFrom(Integer.class) );// false
まぁ、継承階層が違うから false になるケド
ついでに isInstance
Class には isInstance() メソッドもあり、
public boolean isInstance(Object obj)
この場合も instanceof とは並びが逆になる。違いといえば、Java Doc にある通り
Determines if the specified Object is assignment-compatible with the object represented by this Class. This method is the dynamic equivalent of the Java language instanceof operator.
dynamic equivalent 、つまり比較元のクラスを動的に指定できる点
instanceof 演算子だと継承元のクラスを(左側に)静的にコードに書くことになるが、isInstance() だと動的に指定できる