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

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

Susan Sarandon
リリース: 2024-12-18 09:05:10
オリジナル
613 人が閲覧しました

Why Can't I Add Elements to a List

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

Java では、ジェネリックスでワイルドカードを使用する際の制限を理解することが重要です。 List:

List<? extends Number> foo3 = new ArrayList<Integer&gt();
ログイン後にコピー

foo3 に整数を追加しようとすると、次のようなエラーが発生する場合があります:

The method add(capture#1-of ? extends Number) in the type List<capture#1-of ?
extends Number> is not applicable for the arguments (ExtendsNumber)
ログイン後にコピー

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

ワイルドカード ?リスト内の数値を拡張します 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
ログイン後にコピー

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

抽象化の保証

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

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

例: Collections.copy() について

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

public static  void copy(List dest, List src)

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

結論

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

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

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