2

次の方法を検討してください。

public static void listAll(LinkedList list) {

    for(Object obj : list)
        System.out.println(obj);

}

public static void listAll(LinkedList<?> list) {

    for(Object obj : list)
        System.out.println(obj);

}

これら2つの方法の違いは何ですか? 違いがない場合、なぜ 2 番目のものを使用する必要があるのでしょうか。

4

2 に答える 2

4

<?>リストにオブジェクトを追加することはできません。以下のプログラムを参照してください。method に渡した特定のタイプのリスト<?>です。具体的には、 list が特定の型で作成され、 method
に渡されたことを意味します。単語と混同しないでください。特定は、Dog、Tiger、String、Object、HashMap、File、Integer、Long などの通常のオブジェクトにすることができ、リストは無限です。objectを含むリストを定義した (呼び出しメソッドではなく呼び出しメソッドで定義) と、呼び出されたメソッドにadd anyを実行しないメソッドを強制します。 「触るな」と言っているようなものです。<?>listAll specific

JLS<?>irrelevant objects<?>called-listAllspecific type
<?>

public static void listAll(LinkedList list) 
{
    list.add(new String());  //works fine
    for(Object obj : list)
            System.out.println(obj);

}
public static void listAll(LinkedList<?> list) 
{
     list.add(new String());  //compile time error. Only 'null' is allowed.
     for(Object obj : list)
          System.out.println(obj);
}

次に、別のシナリオを見てみましょう。Dog、Tiger、Object、String などの特定の型を宣言するとどうなるでしょうか。メソッドを に変更しましょうspecific type

public static void listAll(LinkedList<String> list)// It is now specific type, 'String'
{
    list.add(new String());//works fine. Compile time it knows that 'list' has 'String'
    for(Object obj : list)
         System.out.println(obj);
}
于 2013-03-20T08:27:36.167 に答える
1

List生の型で、List<?>ワイルドカード引数を持つジェネリック型です。

次の変数があるとします。

List<?> a;
List<String> b;
List c;

代入b=aによりコンパイル時エラーが発生します (aList<String>は に代入できませんList<?) が、正常にc=aコンパイルされます (ジェネリックを使用しないレガシー コードとの互換性のためList<String>に生の型に代入できます)。List

代入b=cはコンパイル時の警告を出します (List<?>は に代入できません List<String>) が、正常にa=cコンパイルされます (List<String>はに代入可能ですList<?>) 。

于 2013-03-20T07:36:10.977 に答える