ワイルドカードジェネリック型を使用した Java コレクションへの値の追加に関する問題
Parent がインターフェイスである次のコードを考えてみましょう。
List<? extends Parent> list = ...; Parent p = factory.get(); // returns concrete implementation list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
なぜこのコードは失敗しますか?
問題はワイルドカードジェネリック型の使用にあります?親を拡張します。この構文は、リストが Parent を拡張する任意の型のオブジェクトを保持できることを示します。これにより柔軟性が得られますが、リスト内のオブジェクトの実際のタイプに関する不確実性も高まります。
コードが失敗する理由を理解するには、次のシナリオを考慮してください。
List<Child> childList = new ArrayList<Child>(); childList.add(new Child()); List<? extends Parent> parentList = childList; parentList.set(0, new Parent()); Child child = childList.get(0); // No! It's not a child! Type safety is broken...
ワイルドカードの種類 ? extends Parent を使用すると、childList をparentList に割り当てることができます。ただし、parentList に Parent 型のオブジェクトを設定しようとすると、コンパイラは、childList 内の対応するオブジェクトも Child 型であることを保証できません。これにより、実行時エラーや予期しない動作が発生する可能性があります。
型の安全性を維持するために、コンパイラは、ワイルドカード ジェネリック型を使用してコレクションに対して実行できる操作を制限します。この場合、コンパイラはオブジェクトと未知の型のリストとの互換性を保証できないため、リストへのオブジェクトの代入は禁止されます。
以上が` のようなワイルドカードジェネリック型を使用して Java コレクションに値を追加できないのはなぜですか?親`を拡張しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。