Java のジェネリックの定義の本来の目的は、実行時に発生するエラーをコンパイル時に確実にチェックできるようにすることです。 と super T> を見てみましょう。 <? super T> はダウンワード モデリングと呼ばれます。これは、Comparable インターフェイスのジェネリック要素がすべて T または T の親クラスであることを意味します。パラメーターを渡すときに、T または T のサブクラスを渡すことができます。 <extendsT> は上方整形と呼ばれます。ArrayList<?extendsT> を例にとると、このリスト コレクション内のすべての要素は、取り出されるときに自動的に T 型に変換されることを意味します。
は固定で、T または T の親クラスを表します。
Java のジェネリックの定義の本来の目的は、実行時に発生するエラーをコンパイル時に確実にチェックできるようにすることです。 と super T> を見てみましょう。
<? super T> はダウンワード モデリングと呼ばれます。これは、Comparable インターフェイスのジェネリック要素がすべて T または T の親クラスであることを意味します。パラメーターを渡すときに、T または T のサブクラスを渡すことができます。
<extendsT> は上方整形と呼ばれます。ArrayList<?extendsT> を例にとると、このリスト コレクション内のすべての要素は、取り出されるときに自動的に T 型に変換されることを意味します。
説明するのは少し難しいですが、実際には数回ノックすれば理解できるでしょう。
データ型からデータを取得したい場合は、? extends ワイルドカードを使用します。
オブジェクトをデータ構造に書き込みたい場合は、? super ワイルドカードを使用します。の場合は、ワイルドカードを使用しないでください。