<? extends Object>
とはどう違い<E extends Object>
ますか?いつ一方を他方よりも使用する必要がありますか?
5 に答える
すぐに思いつく違いは次のとおりです。
型パラメーターの境界は複数の境界を指定できます
T extends A & B
が、ワイルドカードでは複数の境界を指定できません -? extends A & B
は無効です。ワイルドカードを使用して下限を設定できます - 有効
? super A
ですが、型パラメーターT super A
では無効です - 無効です。ジェネリック型の作成中にワイルドカード境界を使用することはできません。型パラメーターの境界を使用する必要があります。
メソッド内で、渡された引数の型パラメーター間に何らかの関係が必要な場合は、型パラメーターの境界を使用する必要があります。たとえば、同じ型パラメーターを持つ 2 つのパラメーター化された型を渡したいとします。ワイルドカード境界ではこれを行うことはできません。したがって、次のメソッド宣言は、 extends という同じ型パラメーターの 2 つのリストを取ります
Number
。public <T extends Number> void merge(List<T> list1, List<T> list2) { }
最後に、 Effective Javaからいくつかのポイントを追加します - 項目 28: 境界付きワイルドカードを使用して API の柔軟性を高めます。
最大限の柔軟性を得るには、プロデューサーまたはコンシューマーを表す入力パラメーターでワイルドカード タイプを使用します。入力パラメーターがプロデューサーとコンシューマーの両方である場合、ワイルドカード型は役に立ちません。正確な型の一致が必要です。これは、ワイルドカードなしで得られるものです。
戻り値の型としてワイルドカード型を使用しないでください。ユーザーに追加の柔軟性を提供するのではなく、クライアント コードでワイルドカード型を使用することを強制します。適切に使用されたワイルドカード型は、クラスのユーザーにはほとんど見えません。これらは、メソッドが受け入れるべきパラメーターを受け入れ、拒否すべきパラメーターを拒否するようにします。クラスのユーザーがワイルドカード型について考える必要がある場合、クラスの API に問題がある可能性があります。
参考文献: