10

重複の可能性:
<?> と <? の違いは何ですか? Java Generics で Object> を拡張しますか?

私はそれを見つけ、同じようList<?>List<? extends Object>行動します。私に関しては、それらの間に違いはありません。私が正しくない場合、違いを説明してもらえますか?

import java.util.ArrayList;
import java.util.List;

public class TestClass {

static void func1(List<?> o, Object s) {
    o.add(null); // only null
    o.add(s); // wrong
    o.get(0);  // OK
}

static void func2(List<? extends Object> o, Object s) {
    o.add(null); // only null
    o.add(s); // wrong
    o.get(0); // OK
}

public static void main(String[] args) {
    func1(new ArrayList<String>(), new Integer(1));
    func2(new ArrayList<String>(), new Integer(1));

    List<? extends Object> list1 = new ArrayList<Object>();
    List<?> list2 = new ArrayList<Object>();

    List<? extends Object> list3 = new ArrayList<String>();
    List<?> list4 = new ArrayList<String>();
}
}
4

4 に答える 4

9

それは複雑です...

型変数Tの場合、仕様にはhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4と記載されています

すべての型変数 ... には境界があります。型変数に対して境界が宣言されていない場合は、Object が想定されます。

ワイルドカードにも当てはまり?? extends Object.

しかし、仕様を調べても、ワイルドカードに上限 (または下限) が必要であるという証拠はまったくありません。「無制限」?は、限定されたワイルドカードとは区別して一貫して扱われます。

List<?>サブタイプ規則から、とList<? extends Object>は互いにサブタイプである、つまり、それらは基本的に同じタイプであると推測できます。E(推論は、 ininterface List<E>に暗黙的な上限があるという事実に依存しObjectますが、ルールではワイルドカードの境界は必要ありません)

それにもかかわらず、仕様は2つを異なる方法で扱います。たとえばhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7 List<?>は具体化可能な型ですが、そうでList<? extends Object>はありません。つまり、

    // ok
    List<?>[] xx = {};
    // fail
    List<? extends Object>[] yy = {};

    // ok
    boolean b1 = (y instanceof List<?>);
    // fail
    boolean b2 = (y instanceof List<? extends Object>);

理由はわかりませんが。ワイルドカードには上限と下限が必要であると言っても過言ではありません。デフォルトはObjectandnull typeです。

于 2013-01-15T22:07:41.480 に答える
1

Similar to how MyClass extends Object for every class List<? extends Object> is the same as List<?>.

于 2013-01-15T20:54:36.413 に答える
1

Java のすべてのオブジェクトは拡張されるため、どちらも同じですObjectList<?>より簡潔なので、私は好むでしょう。

于 2013-01-15T20:53:23.230 に答える
0

Although I'm plagiarising Marko, for which I apologise, his comment is the correct answer.

There is no difference, because implicitly every type extends Object.

于 2013-01-15T20:55:32.203 に答える