ClassA,ClassBがあって、ClassBがClassAを継承している(ClassB extends ClassA)のときは以下のようになる。
- class ClassB extends ClassA { ... }
- ClassA.class.isAssignableFrom(ClassB.class) = true
- ClassB.class.isAssignableFrom(ClassA.class) = false
instanceofとよく似ているが、instanceofはあるインスタンスがあるクラスを継承したものかを調べるのに対して、isAssignableFromメソッドはクラス同士で継承関係を調べるときに使う。
以下コードの(2)のように書くとinstanceofと同等の使い方となる。
まあinstanceofの場合はbがnullだった場合もnullチェックせずに使えるので便利だろう。
- ClassB b = new ClassB();
- // (1) これはtrueになる
- if (b instanceof ClassA) { ... }
- // (2) これもtrueになる
- if (ClassA.class.isAssignableFrom(b.getClass())) { ... }
普通のプログラムだとisAssignableFromメソッドはあまり使わないが、クラスのメタ情報を使って動くようなプログラムを書くときは個人的にはよく使います。