OracleDocGenericMethod の汎用メソッドについて読んでいます。いつワイルドカードを使用し、いつジェネリックメソッドを使用するかという比較について、私はかなり混乱しています。資料より引用。
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
代わりに、ここでジェネリック メソッドを使用することもできます。
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] これは、型引数がポリモーフィズムに使用されていることを示しています。その唯一の効果は、さまざまな呼び出しサイトでさまざまな実引数の型を使用できるようにすることです。その場合は、ワイルドカードを使用する必要があります。ワイルドカードは柔軟なサブタイピングをサポートするように設計されており、それをここで表現しようとしています。
(Collection<? extends E> c);
ワイルドカードライクも一種のポリモーフィズムをサポートしていると思いませんか? では、なぜジェネリック メソッドの使用がこれで良くないと見なされるのでしょうか。
続けて、次のように述べています。
ジェネリック メソッドを使用すると、型パラメーターを使用して、メソッドへの 1 つまたは複数の引数の型とその戻り値の型の間の依存関係を表現できます。そのような依存関係がない場合は、ジェネリック メソッドを使用しないでください。
これは何を意味するのでしょうか?
彼らはその例を提示しました
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[…]
ワイルドカードをまったく使用せずに、このメソッドの署名を別の方法で記述することもできます。
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
ドキュメントは 2 番目の宣言を思いとどまらせ、最初の構文の使用を促進しますか? 最初の宣言と 2 番目の宣言の違いは何ですか? どちらも同じことをしているように見えますか?
誰かがこの領域に光を当てることができますか.