2012-07-16 17 views
47

これらの2つの機能の違いは何ですか?Java Generics WildCard:<? Number>対<T extends Number>

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

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

+3

おそらく違いはないからでしょうか? –

+0

http://stackoverflow.com/questions/6008241/java-generics-e-and-t-what-is-the-difference – swapy

+0

なぜクラス名<?を定義できないのですか? Number>を継承していますが、クラス名は問題ありませんか? –

答えて

31

Tは決して再び使用されないので、このケースでは違いはありません。

Tを宣言する理由は、もう一度それを参照できるため、2つのパラメータ型または戻り値の型を結合するためです。

+0

合意!だから、「?私のために仕事をしますが、「T」はしません。または、ワイルドカードで行うことができるものは、 'T'を使用して行うことができますか? –

+9

'?'が1つしかない場合、それは同等です。複数の '?'がある場合は、2つの型が同じである必要があるかどうかに応じて、 'T'または'? 'のどちらかを使用するか、それらを異なるものにする必要があります。 'x(<?extends Number> a、<?extends Number> b)'メソッドがあれば、それをIntegerとLongで呼び出すことができます。あなたが 'T a、T b'を持っていれば、両方とも同じタイプである必要があります。 – Thilo

+1

しかし、私はまだ x(T a、U b)を行うことができます。だからこれは好ましい方法ですか?ワイルドカードを使用しないことをお勧めします(可能な場合はいつでも)。 –

33

ワイルドカードを使用する場合は、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); 
+0

ワイルドカードが本当に必要なのはいつですか? –

+2

ワイルドカードは実際には「必要」ではありませんが、実際にはバインドされていないタイプ(名前を付ける必要はありません)の場合は、入力が少なくなります。結果のコードは同等です。これは 'int a = 1;の違いと似ています。戻り値aと戻り値1を比較します。あるいは、 ''の代わりに ''を書くと、 – Thilo

4

Tは、使用するどのようなタイプすなわち、有界型であり、あなたは、Numberを拡張し、その特定のタイプの例を固執する必要がありリストにDoubleタイプを渡した場合は、タイプにはタイプがDoubleであり、リストはすでにそのタイプでバインドされているため、タイプをShortに渡すことはできません。対照的に、?wildcard)を使用する場合は、Number(どちらもShortDoubleの両方をそのリストに追加する)を拡張する「任意の」タイプを使用できます。

0

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); 
} 
関連する問題