5

私が読んでいる Java に関する本では、次の 2 つのコードは同等であると書かれています。

public <T extends Animal> void takeThing(ArrayList<T> list)

public void takeThing(ArrayList<? extends Animal> list);

反対側のページでは、後者のコードで「?」ワイルドカードとして、リストに何も追加できないことを意味します。

これは、リスト (または他のコレクション型?) を持っている場合、それらを同時にポリモーフィック引数を受け入れてサイズ変更可能にすることはできないということですか? それとも、単に何かを誤解していますか?

トピックから少し外れていても、すべてのヘルプ/コメントを歓迎します。ありがとう。

4

2 に答える 2

2

これは、リスト (または他のコレクション型?) を持っている場合、それらを同時にポリモーフィック引数を受け入れてサイズ変更可能にすることはできないということですか?

いいえ。

2 つのコードは完全に同等ではありません。最初の行で、メソッドtakeThingには type parameter がありますT。2 行目では、ワイルドカードを使用しています。

最初のバージョンを使用するときは、どの具象型を に使用するかを指定しますT。具象型が既知であるため、リストに追加する問題はありません。

list2 番目のバージョンでは、「はArrayList拡張する未知の型のオブジェクトを含む です」と言っているだけですAnimal。そのタイプが正確に何であるかは不明です。このようなリストにオブジェクトを追加することはできません。これは、リストに追加しようとしているものが許可されているかどうかを確認するのに十分な情報 (実際の型がわからない) がコンパイラにないためです。

于 2012-11-20T14:02:32.080 に答える
1

通常、リストへの追加が、追加するものを持たないリストだけを受け入れるメソッド内で行われる場合、別の場所に何かがあり、Animalそれをリストに追加する必要があります。この場合、メソッドが受け入れるすべてのリスト型Animalがそれらに を追加できるように、メソッドを宣言する必要があります。これは、または の何らかのスーパータイプList<Animal>リストである必要があります。追加する要素は any になる可能性があります。AnimalList<Dog>Animal

ここで、下限の概念とキーワードsuperが登場します。型宣言List<? super Animal>は、上記のように、受け入れ可能なすべての型に一致します。一方、タイプセーフな方法でそのようなリストから要素を取得することはできません。なぜなら、要素は一般にどのような型にもなり得るからです。メソッドが宣言された型の要素の追加と取得の両方を行いたい場合、メソッドAnimalが受け入れることができる唯一の有効な型はList<Animal>.

于 2012-11-20T17:01:05.457 に答える