ホームページ >Java >&#&チュートリアル >リストに要素を追加できないのはなぜですか

リストに要素を追加できないのはなぜですか

Susan Sarandon
Susan Sarandonオリジナル
2024-12-18 09:05:10725ブラウズ

Why Can't I Add Elements to a List

リストを理解していますか? Number> を拡張します。データ構造

Java では、ジェネリックスでワイルドカードを使用する際の制限を理解することが重要です。 List として宣言された List に要素を追加するという具体的な問題を詳しく掘り下げてみましょう。 extends Number>:

List extends Number> foo3 = new ArrayList<integer><p>foo3 に整数を追加しようとすると、次のようなエラーが発生する場合があります:</p>
<pre class="brush:php;toolbar:false">The method add(capture#1-of ? extends Number) in the type List<capture extends number> is not applicable for the arguments (ExtendsNumber)</capture>

リストに追加できない理由 extends Number>

ワイルドカード ?リスト内の数値を拡張します Number> を拡張します。 foo3 は、foo3 が Number を拡張する型ファミリーの値を保持できることを意味します。これは、次の代入がすべて有効であることを意味します:

List extends Number> foo3 = new ArrayList<number>(); // Number extends Number
List extends Number> foo3 = new ArrayList<integer>(); // Integer extends Number
List extends Number> foo3 = new ArrayList<double>(); // Double extends Number</double></integer></number>

ただし、この柔軟性を考慮すると、整合性を損なうことなく foo3 にどのような種類のオブジェクトを追加できるかを確実に判断することは不可能になります。 foo3 が List を指している可能性があるため、Integer の追加は禁止されています。同様に、foo3 が List を参照している可能性があるため、Double の追加は禁止されています。

抽象化の保証

本質的には、List T> を拡張します。は、読み取りのみが可能であり、T または T のサブクラスを取得することを保証します。リストの特定の型を保証できないため、リストに安全に追加することはできません。

対照的に、List< ;?スーパーT>型 T またはそのサブクラスの値を追加できます。これは、リストがその型安全性を侵害することなくそれらの値を保持できることが確実であるためです。

例: Collections.copy() について

考慮してくださいCollections.copy() の署名:

public static <t> void copy(List super T> dest, List extends T> src)</t>

src のワイルドカード (? T を拡張) によってどのように渡すことができるかに注目してください。型 T またはそのサブクラスの値を保持するリスト。src によって生成される値が型 T またはそのサブクラスであることを保証します。これにより、メソッドでさまざまなリスト タイプを処理し、値を安全にコピーできるようになります。

結論

ジェネリックスでワイルドカードを使用する場合の制限を理解することは、堅牢な Java コードを作成するために不可欠です。 List を拡張します。なぜなら、それが指しているリストの特定の種類を保証できないからです。代わりに、そこから読み取ることのみが可能で、型 T` またはそのサブクラスの値を確実に取得できます。

以上がリストに要素を追加できないのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。