生の型との関係 など、ジェネリックに関する特定の質問をカバーするいくつかのトピックを読みました。しかし、 バインドされていないジェネリックに関する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>
に挿入できます。ただし、null
をList<?>
に挿入することしかできません。
ここには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
以外のものを追加することはできません。
混乱している文は、_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
_はコンパイルされ、呼び出しは機能します。これは、一般的なリストに要素を追加する方法です。