ホームページ > Java > &#&チュートリアル > ` のようなワイルドカードジェネリック型を使用して Java コレクションに値を追加できないのはなぜですか?親`を拡張しますか?

` のようなワイルドカードジェネリック型を使用して Java コレクションに値を追加できないのはなぜですか?親`を拡張しますか?

Patricia Arquette
リリース: 2024-12-03 13:51:10
オリジナル
701 人が閲覧しました

Why Can't I Add Values to a Java Collection with a Wildcard Generic Type like `? extends Parent`?

ワイルドカードジェネリック型を使用した 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート