私は Guava ImmutableList
をof
メソッドで作成でき、渡されたオブジェクトに基づいて正しいジェネリック型を取得します。
Foo foo = new Foo();
ImmutableList.of(foo);
ただし、 パラメータなしのof
メソッド はジェネリック型を推測できず、ImmutableList<Object>
を作成します。
空のImmutableList
を作成してList<Foo>
を満たすにはどうすればよいですか?
作成したリストを変数に割り当てる場合、何もする必要はありません。
_ImmutableList<Foo> list = ImmutableList.of();
_
型を推測できない他の場合は、@ ziggが言うようにImmutableList.<Foo>of()
を記述する必要があります。
ImmutableList.<Foo>of()
は、空のImmutableList
をジェネリック型Foo
で作成します。 コンパイラはジェネリック型を推論することができます 変数への割り当てのような状況では、関数の引数に値を提供するときに、(私がしたように)この形式を使用する必要があります。
Java 8なので、コンパイラーははるかに賢く、より多くの状況で型パラメーターのパラメーターを理解できます。
例:
_void test(List<String> l) { ... }
// Type checks in Java 8 but not in Java 7
test(ImmutableList.of());
_
Java 8の新しい点は、式の target type を使用して、そのサブ式の型パラメーターを推測することです。Java 8は、型パラメーターの推論に使用されるメソッドへの引数のみです(ほとんどの場合、1つの例外は割り当てです)。
この場合、test
のパラメーター型はof()
のターゲット型になり、戻り値の型of
はその引数型と一致するように選択されます。