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番目の宣言の違いは何ですか?どちらも同じことをしているように見えますか?
誰かがこのエリアに光を当てることはできますか?
?
。`public static <T1 extends Number、T2 extends Number> void copy(List <T1> dest、List <T2> src)として書き直すことができ、この場合、何が起こっているかが明らかになります。