型推論(var) — ローカル変数の簡潔化(Java 10+)
Java 10から導入された var は、ローカル変数の型をコンパイラに推論させる仕組みです。
「型を明示しなくても、右辺から自動的に型が決まる」ので、コードが簡潔になります。初心者向けに、基本から例題まで解説します。
基本の書き方
var message = "Hello"; // String型と推論される
var number = 123; // int型と推論される
var list = new ArrayList<String>(); // ArrayList<String>型
Java- 右辺の型から自動決定される。
- 型安全: 推論されても型は固定されるので、別の型は代入できない。
var text = "abc";
// text = 100; // コンパイルエラー(String型にintは代入不可)
Java使える場所と制約
- 使える場所: ローカル変数(メソッド内の変数、forループの変数)。
- 使えない場所: フィールド、メソッド引数、戻り値型。
- 必須: 初期化が必要(右辺がないと型を推論できない)。
var x; // コンパイルエラー(右辺がない)
Java例題で練習
例題1: コレクションの簡潔化
var names = new ArrayList<String>();
names.add("Tanaka");
names.add("Sato");
for (var n : names) {
System.out.println(n.toUpperCase());
}
Java👉 型を省略しても、names は ArrayList<String> と推論される。
例題2: Mapのエントリ処理
var map = Map.of("apple", 100, "banana", 200);
for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
Java👉 entry の型は Map.Entry<String, Integer> と推論される。
例題3: forループのインデックス
for (var i = 0; i < 5; i++) {
System.out.println("i=" + i);
}
Java👉 i は int と推論される。
例題4: Stream処理での簡潔化
var list = List.of("A", "BB", "CCC");
list.stream()
.map(s -> s.length())
.forEach(len -> System.out.println("len=" + len));
Java👉 list は List<String> と推論される。
テンプレート集
基本形
var 変数名 = 式; // 式の型から推論
Javaforループ
for (var i = 0; i < N; i++) { ... }
Java拡張for
for (var item : collection) { ... }
Java注意点と落とし穴
- 可読性: 型が見えなくなるので、右辺から型が分かる場合に使う。
- 曖昧な型:
var x = null;は推論できない。 - ジェネリクス:
new ArrayList<>()のようにダイヤモンド演算子と組み合わせると便利。 - 過剰使用はNG: すべて
varにすると型が分かりにくくなる。
まとめ
varはローカル変数の型をコンパイラに推論させる仕組み。- コードが簡潔になるが、型安全は保たれる。
- 右辺から型が分かる場合に使うのがベスト。
👉 練習課題として「商品の価格表をMapで作り、forループで出力する」コードを var を使って書いてみると、型推論の便利さが体感できます。
