【Java】ローカル変数の型推論

Java10でローカル変数にも型推論を利用することができるようになりました。

本稿はその型推論についてみていきます。

型推論をうまく利用すると、明示的な型宣言が必要なくなるので、プログラミングが楽になります。

Java8から導入されているラムダ式の記述も型宣言を省略できました。それと似たようなことがローカル変数宣言時に利用できます。ローカル変数っていうのはメソッド内に宣言された変数ですね。

var宣言を使用して型推論をさせてみよう

型推論を利用するには

var 変数名;

で宣言します。

変数に代入される値を元に型を自動的に決定するので、初期化時のみなんでも代入できます。

例えば、下記のような宣言をした場合、自動的にそれぞれに適合する型として扱えるようになります。

var str = "あいうえお";//String型になる
var val = 150;//int型になる
var chara = new CharaData();//CharaData型になる

ただし、複数人開発の場合は可読性を損なう可能性も考えて、使いどころには気を付けたほうがよさそうですね。

ではではクソ長いクラス名を付けて実際にvarを使用して楽をするサンプルを見てみるとしましょう。

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test {

	public static void main(String[] args) {
		//varで文字列宣言
		var str1 = "ついカッとなってしまった";
		var str2 = "サブミッションをかけてきた";

		//String型のメソッドも使えます
		System.out.print("文字が読めない少年は");
		System.out.println(str1.substring(0,8).concat(str2));

		//varでSuperUltraSamboMamboMarshallArts型宣言
		var chara1 = new SuperUltraSamboMamboMarshallArts(str1);
		var chara2 = new SuperUltraSamboMamboMarshallArts(str2);

		//拡張for文とかでも使えるよ
		for (var chara : Stream.of(chara1,chara2).collect(Collectors.toList())) {
			chara.print();
		}

		//一度型が確定した変数に別の型を入れようとするとコンパイルエラー
		//str1 = chara1;
	}
}

class SuperUltraSamboMamboMarshallArts{
	String atk;
	SuperUltraSamboMamboMarshallArts(String atk){
		this.atk = atk;
	}
	void print() {
		System.out.println("ストロング所長は"+atk);
	}
}
実行結果

文字が読めない少年はついカッとなってサブミッションをかけてきた
ストロング所長はついカッとなってしまった
ストロング所長はサブミッションをかけてきた

型推論で匿名クラスの型を宣言できる

型推論を利用することで匿名クラスの型を宣言できます。

これができるということは、その場で実装したメソッドが変数経由で利用できるようになるのです。

public class Test {
	public static void main(String[] args) {
		var function = new Object() {
			void execute() {
				System.out.println("こいつは素晴らしい!!");
			}
		};
		function.execute();
	}
}
実行結果

こいつは素晴らしい!!

ローカルに自由な関数宣言をしたかったことが少なからずあったから助かるわー

以前ならこんな感じでコンパイルエラーでしたね。まあ当然ですがObject型にexecuteメソッドはないので・・・

public class Test {
	public static void main(String[] args) {
		Object function = new Object() {
			void execute() {
				System.out.println("こいつは素晴らしい!!");
			}
		};
		function.execute();//コンパイルエラー
	}
}

まあ、今回の型推論ですがラムダ程の驚きはないにしろ、楽をしたいときに役には立ちそうです。

C#にもvar宣言は存在しますし、C++にはautoがあります。それらと似たようなもののようですね。

JavaScriptにもvar宣言がありますが、そっちとは扱いが違いますので、気を付けましょう。

Java

Posted by nompor