私は、受け入れられた答えに完全には同意しません。
このような場合、期待する戻り値の型を明示的に示すことで、コンパイラに少し助けを与える必要があります。
これは私には正しく聞こえません。ジェネリック メソッドと型の推論について理解しているので、角かっこで囲まれた型は、ジェネリック メソッドの戻り値の型を直接示しているわけではありません。むしろ、型T
は、戻り値の型、引数の型、ジェネリック メソッドに関連付けられたローカル変数の型である可能性があります。
実際、型推論メカニズムのおかげでT
、ほとんどの場合 (特定の状況に限らず) 型パラメーターを指定する必要はありません。あなたの例では、他のほとんどの場合と同様に<T>
、メソッド呼び出しから安全に省略できます。ObjectGenerator.<T> getObject(objectName)
これは、ジェネリック メソッドの型が、結果が代入される、または返される型T
から容易に推測できるためです。つまり、メソッド呼び出しの前に宣言するので、型は として正常に推論されます。private T object
T
T
私の主張は、決定的なチュートリアルからの次のステートメントによってバックアップできます。
型推論は、各メソッド呼び出しと対応する宣言を調べて、呼び出しを適用可能にする型引数 (または複数の引数) を決定する Java コンパイラの機能です。推論アルゴリズムは、引数の型を決定し、可能な場合は、結果が割り当てられる、または返される型を決定します。最後に、推論アルゴリズムは、すべての引数で機能する最も具体的な型を見つけようとします。
推論の仕組みに関する 2 つの例:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
型は、宣言された担当者の型に基づいてT
推論されます。Serializable
public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {}
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);
型は、渡された引数の型に基づいてU
推論されます (つまり、 type です)。したがって、上記のメソッド呼び出しから安全に省略できます。Integer
Integer.valueOf(10)
Integer
<Integer>
要約すると、ジェネリック メソッドの型パラメーターをその引数の型、または (メソッドの呼び出し時に) 結果が代入または返される型から推測できない場合を除き、メソッドの直前の型指定を安全に省略できます。呼び出し。