「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ワイルドカードジェネリックタイプ (`? extends Parent`) を使用して Java コレクションに要素を追加できないのはなぜですか?

ワイルドカードジェネリックタイプ (`? extends Parent`) を使用して Java コレクションに要素を追加できないのはなぜですか?

2024 年 12 月 17 日に公開
ブラウズ:118

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

タイプ セーフティとワイルドカード ジェネリック: 禁止された修飾子を理解する

Java でジェネリック コレクションを操作する場合、ワイルドカード ジェネリックの概念によって特定の現象が発生する可能性があります。最初は直観に反するように思えるかもしれない制限。代表的な例は、ワイルドカード ジェネリック型を使用して Java コレクションに値を追加できないことです。

次のコード スニペットを考えてみましょう。

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 を拡張し、Parent インターフェイスの子孫である要素のリストを表します。これらの要素の無制限の取得は許可されますが、型安全性により、コレクションへの値の追加には制限が課せられます。

コードのコンパイルが許可されている場合、リスト内の要素への親インスタンスの割り当てが許可されます。ただし、この操作によりタイプ セーフティが損なわれる可能性があります。

次のシナリオを考えてみましょう。

List childList = new ArrayList();
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...

このシナリオでは、子オブジェクトのリストが ? のリストにキャストされます。親を拡張します。その後、親インスタンスをリストの最初の要素に割り当てると、結果のリストに有効な子インスタンスではない要素が含まれるため、タイプ セーフティに違反します。

不変のタイプ セーフティの確保

ワイルドカードのジェネリック コレクションへの値の追加を禁止することで、Java は不変のタイプ セーフを強制します。これにより、リストの要素が、宣言された型によって課せられる制約に常に従うことが保証されます。

この制限がない場合、型の安全性が損なわれ、潜在的なエラーや予期しない動作が発生する可能性があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3