2016-02-08 10 views
5

私は、relationship with raw typesのようなジェネリックに関する特定の質問を扱ういくつかのトピックを読んだ。しかし、 Java SE tutorial on unbound genericsにある特定の行についての追加説明が必要です。Javaジェネリック、アンバウンドワイルドカード<?>対<Object>

文によると:

がprintlistの目標は、あらゆるタイプのリストを印刷することであるが、それはその目標を達成するために失敗した - それは、Objectインスタンスのリストだけを出力します。リスト<の>、リスト<の文字列>、リスト<のダブル>などをリスト<オブジェクト>のサブタイプではないために出力することはできません。

この文章をよく理解すれば、 List<?>List<Object>の違いは、前者を実装することによってtype引数List<String>またはList<Integer>を使用できることです。後で実装する場合は、型引数List<Object>しか使用できません。あたかもList<?>Objectの上限であるかのように、すなわちList<? Object>になります。

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

List<Object>List<?>は同じではありません。 List<Object>にオブジェクトまたはオブジェクトの任意のサブタイプを挿入できます。しかし、nullList<?>にしか挿入できません。

+2

私はここで「あなたが求めているものは不明」としなければならない。 – Mena

+0

彼は '付加的な説明 'を望んでいる。 – ctst

+0

あなたの情報がどこから届いているのか分かりませんが、あなたが提供する例文はどちらも間違っています。 – jervine10

答えて

9

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

しかし、このような方法:

public void print(List<Number> list); 

が実際にのみ正確List<Number>あるListかかります。 List<Integer>と宣言されているリストは一切ありません。

だから、違いはList<?>が何らかの宣言で任意の一覧がかかりますが、List<Object>のみList<Object>、何もないよう宣言された何かがかかります。

最後の引用では、List<?>は、文字通りそのアイテムのタイプがわからないというリストです。そのため、null以外は何も追加できません。

+0

そして 'List <? Number> 'を拡張しますか? – biziclop

+2

'List <? 'List 'と '' extends Number> 'は、少なくとも* Numberに*宣言されたリストをとるので、' List 'と' List 'となるでしょう。 –

+0

'リスト<?オブジェクト>を拡張します。だから 'List 'と 'List 'の違いは 'List 'と 'List <? Number> 'を継承します。 – biziclop

7

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

は、次のコードを試みたとします:あなたはList<?>null以外のものを追加することはできませんので

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); 
} 

addObjectToList1は、コンパイルされません。

addObjectToList2のコンパイル(これは。文はあなたを教えしようとしているものです)、しかしList<Object>List<String>のスーパータイプではないのでmain()で、それへの呼び出しは、コンパイルされません。

addObjectToList3両方がコンパイルされ、呼び出しが機能します。これは、要素をジェネリックリストに追加する方法です。

関連する問題