【Java】型判定をするinstanceof

2022年1月9日

本稿ではinstanceof演算子を使用し、型判定をする方法を説明します。

instaceof演算子は変数の型が何なのかを調べるための演算子です。

instanceofを使えば、実装しているインターフェースや継承しているクラスを調べることができます。

instanceofの利用

型比較したいときには「変数名 instanceof 型」と記述しましょう。

型が一致した場合は、trueを返します。

変数名は必ず左でなければなりません。左右逆での使用はできないんですね。

それではinstanceofでどんな結果が得られるのかを見てみましょう。

public class Test{
	public static void main(String[] args){
		Object ch = new Chara();
		System.out.println("new CharaはChara型ですか?:"+(ch instanceof Chara));
		System.out.println("new CharaはEnemy型ですか?:"+(ch instanceof Enemy));
		System.out.println("new CharaはBase型ですか?:"+(ch instanceof Base));
		System.out.println("new CharaはImpl型ですか?:"+(ch instanceof Impl));
		
		Object ch2 = new Enemy();
		System.out.println("new EnemyはChara型ですか?:"+(ch2 instanceof Chara));
		System.out.println("new EnemyはEnemy型ですか?:"+(ch2 instanceof Enemy));
		System.out.println("new EnemyはBase型ですか?:"+(ch2 instanceof Base));
		System.out.println("new EnemyはImpl型ですか?:"+(ch2 instanceof Impl));
	}
}
interface Impl{
}
class Base{
}
class Chara extends Base implements Impl{
}
class Enemy extends Base{
}
実行結果

new CharaはChara型ですか?:true
new CharaはEnemy型ですか?:false
new CharaはBase型ですか?:true
new CharaはImpl型ですか?:true
new EnemyはChara型ですか?:false
new EnemyはEnemy型ですか?:true
new EnemyはBase型ですか?:true
new EnemyはImpl型ですか?:false

instanceofをたくさん使用するような事態になることはなるべく避けましょう。

頻繁に使うということは、設計があまりよろしくないということが多いです。

instanceof利用時に変数定義

Java 16より新しく判定と同時にキャストした型の変数をそのまま定義することができるようになりました。

public class Test {
	public static void main(String[] args) {
		Object o = new Chara("天使です。");

		//型判定と変数定義を行う
		if ( o instanceof Chara ch ) {
			System.out.println(ch.name);
		}
	}
}
class Chara {
	String name;
	Chara(String name){
		this.name = name;
	}
}
実行結果

天使です。

これまでは

		if ( o instanceof Chara ) {
			Chara ch = (Chara)o;
			System.out.println(ch.name);
		}

のような書き方をしなければなりませんでした。

コード量が少し減って楽になりますね。

Java

Posted by nompor