はじめに
JavaSilver試験対策です。
varによる型推論が できる/できない を整理しました。
型について
推論できる型
- 基本型
- String型
- newで明示的に初期化した配列
- コレクションクラス
- メソッドの戻り値
public static void main(String[] args) {
var v1 = 1;
var v2 = "abc";
var v3 = new int[]{1,2,3};
var v4 = new ArrayList<String>();
var v5 = calc();
}
public static int calc() { // ここで戻り値の型を定義しているから型推論できる
return 1;
}
(補足)コレクションクラスの注意点
コレクションクラスの型推論は、ダイヤモンド演算子<>で型を明記しなくてもコンパイルエラーにはならない。その場合、Object型として認識されるのでこのコレクション型にはいろんな型やnullを格納できる。
ただし、Object型として扱っているので他の型の変数に代入する際は明示的なキャストが必要となる。
var varList = new ArrayList<>();
varList.add("abc");
varList.add(1);
varList.add(null)
String str1 = varList.get(0); // コンパイルエラー
String str2 = (String)varList.get(0); // OK
推論できない型
- 初期化をしない
- nullによる初期化
- 配列初期化子
- ラムダ式
// これらはすべてコンパイルエラー
var v1;
var v2 = null;
var v3 = {1,2,3};
var v4 = () -> {};
※配列について
場所について
宣言できる場所
- ローカル変数
メソッド内の変数など、短命な変数として扱う場合のみ利用できる。
public class Sample {
public void method() {
var v = 1; // OK
}
}
宣言できない場所
- フィールド変数(クラス直下)
- メソッドの引数
public class Sample {
var v1 = 1; // コンパイルエラー
public void method(var v2)) { // コンパイルエラー
v2 += 1;
}
}
その他のルール
付与できる修飾子はfinalのみ
final(再代入の禁止)とvar(型推論)は役割が異なるので共存できる。
public,private,staticなどの修飾子は付与できない。
(varはローカル変数としてしか扱えないから)
final var NUM = 1; // OK
public var v1 = 1; // コンパイルエラー
static var v2 = 1; // コンパイルエラー
複数宣言はできない
var v1 = 1,v2 = 2; // コンパイルエラー
変数による初期化
型推論した変数を使って、別の変数の初期化ができる。
var v1 = 1; // この時点でコンパイラはv1をint型だと推論できるので
var v2 = v1; // ここでv2もint型だと推論できる