web-dev-qa-db-ja.com

Javaジェネリック、無制限のワイルドカード<?> vs <Object>

生の型との関係 など、ジェネリックに関する特定の質問をカバーするいくつかのトピックを読みました。しかし、 バインドされていないジェネリックに関するJava SEチュートリアル にある特定の行について追加の説明が必要です。

文によると:

PrintListの目的は、任意のタイプのリストを印刷することですが、その目的を達成することはできません。オブジェクトインスタンスのリストのみを印刷します。 List <Integer>、List <String>、List <Double>などは、List <Object>のサブタイプではないため、印刷できません。

私がこの文をよく理解していれば; List<?>List<Object>の違いは、前者を実装することで型引数List<String>またはList<Integer>を使用できることです。後者を実装する場合、使用できるのは型引数List<Object>のみです。 List<?>Objectの上限、つまりList<? Object>であるかのように。

しかし、次の文は、私が以前に理解したことによれば、List<Object>にはクラスObjectのインスタンスのみが含まれ、他のものは含まれないという意味で、私を混乱させます。

List<Object>List<?>は同じではないことに注意することが重要です。オブジェクトまたはオブジェクトの任意のサブタイプをList<Object>に挿入できます。ただし、nullList<?>に挿入することしかできません。

18
Aetos

ここには2つの別々の問題があります。 List<Object>は、実際、あなたが言うように、どんなオブジェクトでも取ることができます。 List<Number>少なくともNumberオブジェクト、またはもちろんIntegerのような任意のサブクラスを取ることができます。

ただし、次のような方法:

public void print(List<Number> list);

実際にはのみListを取ります。これは正確にList<Number>です。 List<Integer>と宣言されているリストは取得されません。

したがって、違いはList<?>は任意の宣言を含むリストを取得しますが、List<Object>のみ宣言されたものを取得しますList<Object>として、他には何もありません。

最後の引用は、List<?>は、そのアイテムがどのタイプであるかを文字通り知らないリストであると単純に述べています。そのため、null以外のものを追加することはできません。

22

混乱している文は、_List<?>_はすべての汎用リストのスーパータイプですが、_List<?>_コレクションには何も追加できないことを警告しようとしています。

次のコードを試したとします。

_private static void addObjectToList1(final List<?> aList, final Object o ) {
    aList.add(o);
}

private static void addObjectToList2(final List<Object> aList, final Object o ) {
    aList.add(o);
}

private static <T> void addObjectToList3(final List<T> aList, final T o ) {
    aList.add(o);
}


public static void main(String[] args) {
    List<String> testList = new ArrayList<String>();
    String s = "Add me!";
    addObjectToList1(testList, s);
    addObjectToList2(testList, s);
    addObjectToList3(testList, s);
}
_

null以外のものを_addObjectToList1_に追加できないため、_List<?>_はコンパイルされません。 (それが文があなたに伝えようとしていることです。)

_addObjectToList2_はコンパイルされますが、_List<Object>_は_List<String>_のスーパータイプではないため、main()での呼び出しはコンパイルされません。

_addObjectToList3_はコンパイルされ、呼び出しは機能します。これは、一般的なリストに要素を追加する方法です。

10
Matthew McPeak