type - Java Generics WildCard:<? extends Number>対<T extends Number>



java type parameter getclass (3)

Tを使用すると、Listですべてのタイプのアクションを実行できます。 しかし、あなたが使用すると、追加を実行することはできません。

T - フルアクセスのオブジェクト参照と同じ
? - 部分アクセスを与える

static void gPrint(List<? extends Number> l) {
 l.add(1); //Will give error
for (Number n : l) {
    System.out.println(n);
}

static <T extends Number> void gPrintA(List<T> l) {
l.add((T)1); //We can add
for (Number n : l) {
    System.out.println(n);
}

https://code.i-harness.com

これらの2つの機能の違いは何ですか?

static void gPrint(List<? extends Number> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

static <T extends Number> void gPrintA(List<T> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

私は同じ出力を見る。


Tは束縛型です。すなわち、あなたが使用するどのような型であれ、 Numberを拡張する特定の型に固執する必要があります。例えば、 Double型をリストに渡すと、 T型がDouble型であるためShort型を渡すことはできません。リストはすでにその型によってバインドされています。 対照的に、あなたは?wildcard )では、 Numberを拡張する "any"型を使用できます(そのリストにShortDouble両方を追加します)。


違いは、ワイルドカードを使用するときはT参照できないということです。

あなたは今ではないので、違いはありませんが、ここで違いを生かすためにTを使う方法があります:

static <T extends Number> T getElement(List<T> l) {
    for (T t : l) {
        if (some condition)
            return t;
    }
    return null;
}

これは渡されるものと同じ型を返します。例えば、これらは両方ともコンパイルされます:

Integer x = getElement(integerList);
Float y = getElement(floatList);




generics