あの、isAssignableFrom ってよくわからなくなるんですケド


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() だと動的に指定できる