instanceof 演算子のサンプル右辺がインターフェースの場合にどうなるか混乱したのでまとめてみた。基本的にクラスと同じで、そのインターフェイスを実装しているかどうかという判断結果が返ってくる。
[InstanceOf.java]
/**
* instanceof と継承クラス・インターフェイス テストクラス
*/
/* 簡易クラス図
*
* Japan
* ↑
* Kantou
* ↑
* Chiba
*/
interface State {}
class Japan{}
class Kantou extends Japan implements State {}
class Chiba extends Kantou{}
public class InstanceOf {
public static void main(String[] args) {
Japan japan = new Japan();
Kantou kantou = new Kantou();
Chiba chiba = new Chiba();
State st1 = new Kantou();
State st2 = new Chiba();
if(japan instanceof Kantou) {
// japan は Kantou クラスが必要ではないのでfalse
System.out.println("japan instanceof Kantou");
}
if(chiba instanceof Kantou) {
// chiba は Kantou クラスが必要なのでtrue
System.out.println("chiba instanceof Kantou");
}
if(kantou instanceof Japan) {
// kantou は Japan クラスが必要なのでtrue
System.out.println("kantou instanceof Japan");
}
if(st1 instanceof Kantou) {
// st1 は Kantou クラスそのものなのでtrue
System.out.println("st1 instanceof Kantou");
}
if(st2 instanceof Chiba) {
// st2 は Chiba クラスそのものなのでtrue
System.out.println("st2 instanceof Chiba");
}
if(japan instanceof State) {
// japan は State を実装していないので false
System.out.println("japan instanceof State");
}
if(kantou instanceof State) {
// kantou は State を実装しているのでtrue
System.out.println("kantou instanceof State");
}
if(chiba instanceof State) {
// chiba は State を実装しているのでtrue
System.out.println("chiba instanceof State");
}
if(chiba instanceof Object) {
// chiba は Object が必要なのでtrue
System.out.println("chiba instanceof Object");
}
}
}
[実行結果]
chiba instanceof Kantou
kantou instanceof Japan
st1 instanceof Kantou
st2 instanceof Chiba
kantou instanceof State
chiba instanceof State
chiba instanceof Object