2

私が理解している限り、a は特定の、まだ未知のタイプList<?>のリストとして定義されています。したがって、このパラメータタイプが何であれ、Javaでは拡張しないタイプを使用できないため、拡張する必要があります。では、なぜ次のコードがコンパイルされないのですか?不変量にどのように違反していますかListObjectObjectlistObj

    List<?> listObj = returnSomeList();
    listObj.add(new Object()); //Why does this not work ?
4

5 に答える 5

7

List<?> listObjさまざまな種類のオブジェクトを格納できる任意のタイプのリストを指すことができます。

たとえば、オブジェクトを追加しても安全だと思いますか

List<?> listObj = new ArrayList<String>();
listObj.add(new Object());
于 2013-02-23T20:09:52.660 に答える
3
List<?> and `List<? extends Object>` are identical.

?を使用するコレクションに何かを追加することはできません。タイプ構文(サブタイプを持つワイルドカード)を拡張します。理由は、コレクションに間違ったタイプを追加している可能性があるためです。

許可された場合:

List<?> listOfObjects = new ArrayList<Object>();
listOfObjects.add(new Object()); //not valid
somewhere in future

listOfObjects = new ArrayList<Animal>();
listOfObjects.add(new Animal());

許可されている場合は、オブジェクトリストに動物を追加しただけです。これにより、ジェネリック型の理由全体が台無しになります。コレクションからAnimalを取得するときは、instanceOfチェックを再度実行して、そのAnimalであるかどうかを確認し、ジェネリックス以前のコードで行ったように、animalにキャストし直す必要があります。

関連する質問

于 2013-02-23T20:07:25.557 に答える
0

Objectこれは、Javaで最も一般的な型だからです。どのレベルにも固有のものとして呼び出される資格はありません。

于 2013-02-23T20:09:46.500 に答える
0

「?」WildCard Captureと呼ばれ、タイプパラメータが不明なタイプと一致することを意味します。これの意味は

 List<?> listObj = returnSomeList(); 

のリストです

 Unknown Type 

そして、あなたはオブジェクトをリストに追加しようとしています

  Unknown Type.

あなたが投稿した例では、コンパイル時のエラーが発生します。

于 2013-02-23T20:18:05.620 に答える
0

List<Object>aとaList<?>または。の間で混乱を招いていList<? extends Object>ます。

を使用するList<Object>と、何でも入れることができますがList<?>、これがリストである、または(必然的に)を受け取るという意味ではありませんList<Object>

を受け取る可能性がありますList<Object>。この場合、オブジェクトを追加することは許可されます。ただし、、、、またはのような他のものを受け取ることもList<Integer>できList<String>ますList<Animal>List<Integer>明らかに、オブジェクトを、、、List<String>またはに追加することはできませんList<Animal>

コンパイラは命令間でオブジェクトのタイプを記憶しないため、オブジェクトをに設定しても、コンパイラはオブジェクトをに設定しList<?>List<Object>ことを記憶しないため、オブジェクトの追加は常に違法になりますList<Object>

于 2013-02-23T20:33:57.797 に答える