84

これら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);
    }
}

同じ出力が表示されます。

4

4 に答える 4

51

この場合、Tは二度と使用されないため、違いはありません。

a を宣言する理由は、T再度参照できるようにするためです。これにより、2 つのパラメーターの型または戻り値の型が結合されます。

于 2012-07-16T01:08:34.227 に答える
49

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);
于 2012-07-16T01:15:43.660 に答える
12

Tは境界付きの型です。つまり、使用する型が何であれ、拡張する特定の型に固執する必要がありますNumber。たとえば、型をリストに渡す場合、型をDoubleそのまま渡すことはできず、リストはすでにその型によって制限されています。タイプ。対照的に、( ) を使用する場合は、拡張する「任意の」型を使用できます(そのリストに と の両方を追加します)。ShortTDouble?wildcardNumberShortDouble

于 2014-08-17T05:06:06.520 に答える
-2

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);
}
于 2016-04-21T13:07:37.730 に答える