5

ArrayList<? extends My_Class>このように宣言すると、新しい要素を追加できなくなるため、どこに行けばよいでしょうか。

ArrayList<? extends My_Class> obj=new ArrayList<? extends My_Class>();
list.add(new Derived_My_Class()); //this is compilation error
4

3 に答える 3

5

これらのキーワードを説明するために広く使用されている頭字語は次のとおりです。 PECS: Producer extends - consumer super.

したがって、「拡張」を使用すると、コレクションは指定されたタイプの要素を生成します。したがって、追加することはできません。取得することしかできません。

使用例は、API のクライアントにリストを提供することです。

public List<? extends CharSequence> getFoo() {
    List<String> list = new ArrayList<String>();
    list.add("foo");
    return list;
}

関連: Java ジェネリック: Collections.max() シグネチャと Comparator

于 2012-07-26T12:30:14.737 に答える
2

あなたは正しいです、あなたArrayListはそれが派生した方法で使用することはできません: あなたがそれに入れることができるものは何もありません.

格納するために必要なものMy_Classとそのサブクラスは単純ArrayList<My_Class>です。オブジェクトMy_ClassとそのすべてをDerivedClass正しく取得します。

于 2012-07-26T12:32:25.247 に答える
0

まあ...このようにArrayListを宣言する意味はありません。むしろ、あなたの意図は書くことによって満たされます

ArrayList< スーパータイプ > obj=新しい ArrayList< スーパータイプ >();

私の経験によると、呼び出し元が特定のスーパータイプのサブタイプのコレクションを提供することを期待するメソッド引数でこの概念を見てきました(または、誰かが上で言ったようにメソッドから戻ります)。次のように

public getAnimals(List< ? extends Animal> obj){

obj.add(something);    //not allowed

}

ロバ、サル、鳥などを特定のタイプのリストに追加できる可能性がかなりあります(サル)。そこから取得中にclassCastExceptionを取得します。

そのため、この場合は許可されません。Josh Bloch 著『Effective Java』を読んでください。彼は生産者と消費者のアナロジー(PECS)でそれをうまく説明してくれました

于 2012-07-26T12:33:45.970 に答える