この種の一般的なメソッドに出くわすと、混乱します。
public static <T> T addAndReturn(T element, Collection<T> collection){
collection.add(element);
return element;
}
<T>
このメソッドで が必要な理由がわかりません。
また、ジェネリック メソッドとジェネリック構文を使用するメソッドの違いは何ですか?
T の代わりにオブジェクトを使用すると、関数はオブジェクトを返します。
T が返されたら、次のようなことができます。
addAndReturn(myElement, col).SomeMethodOfMyElement();
addAndReturn が代わりにオブジェクトを返した場合は、どちらかを使用する必要があります
((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement();
明示的なキャストが必要な場合、または
addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;
1 つではなく 2 つのステートメントが必要です。
編集:質問がフォーマットされたので、パラメーターの1つがCollection<T>
. その場合、一般的な構文により、
addAndReturn(mySquare, collectionOfCircles);
実行時エラーではなく、コンパイル時エラーを返します。
編集:そして、あなたの質問が<T>
一般的なジェネリックの使用ではなく構文に関するものであった場合に備えて:メソッド定義で使用されているのはクラス T ではなく、クラスに「適合する」クラスのプレースホルダーである<T>
ことをコンパイラに伝えますメソッドの特定の呼び出し。T
Tは、多形的な理由で使用されます。Tは、任意のタイプのクラスTypeです。
そうは言っても、たとえばCustomerクラスを作成する場合は、この上記のメソッドを使用して、ユーザータイプCustomerクラスを処理できます。Tを使用すると、任意のタイプに配置できます。
Tを使用すると、値型やその他の型の場合と同じように、この汎用メソッドを独自のユーザー定義型に使用できます。Tは、要素パラメーターで指定されたタイプになります。
つまり、一般的な T は、返されるより具体的な型の単なるプレースホルダーです。T を指定した場合、コレクションに追加する要素のタイプです。
Collection<int> intCollection = new Collection();
int addedInt = addAndReturn(5, intCollection);
addedInt == 5;
それらはすべてT1またはT2ではなくTであるため、関数がジェネリックコレクションにタイプを追加するため、明らかに単一のタイプが必要であるため、同じタイプのオブジェクトである必要があります
このメソッドはelement
おそらく同じ入力を返します。これは、実装者がFluent Interfaceのような方法を使用して、より読みやすい API を提供することを意図したためと考えられます。
addAndReturn(myElement, col).doElementStuff().doOtherElementStuff();
ここには、完全で啓発的な Java ジェネリックに関するすばらしいチュートリアルがあります。