2016-06-30 13 views
2

以下のメソッドをワイルドカードの有無にかかわらず記述しました。最初の例では、ワイルドカードのオブジェクト内でどのように相違していますか?どのようにですか?オブジェクトとは違う?

public void sumOfNumbers(List<? extends Number>numbers){ 
    int sum=0; 
    for(Number n:numbers){ 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 

以下のワイルドカードを使用しないこの方法では、なぜパラメータに入れることができますか?

public<T extends Number> void sumOfNumbers(List<T>numbers){ 
    int sum=0; 
    for(Number n:numbers){ 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 

最後に、 extends Numberなぜ、私は以下のように各ループに対して整数を持っていますか?

public void sumOfNumbers(List<? extends Number>numbers){ 
    int sum=0; 
    for(Integer n:numbers){//Why cant I do this?? 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 

また、なぜループごとにnumberを入れることができますか?この場合、上限は整数ですか?それ以下の数字はありませんか?

public void sumOfNumbers(List<? extends Integer>numbers){ 
    int sum=0; 
    for(Integer n:numbers){//Why cant I do this?? 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 
+0

最初のケースで何を聞いているのか分かりません。なぜ 'List 'や 'List 'と書くことができないのですか? –

+1

あなたのリストは必ずしも 'Integer'sで構成されているわけではありません。なぜなら' List 'の場合はどうでしょうか? –

+0

はい、それは本当ですが、それはうまくいかないでしょうか? – Eli

答えて

1

私はワイルドカードなしで以下の方法を書かれています。最初の例では、ワイルドカードのオブジェクト内でどのように相違していますか?

疑問符の代わりにObjectを使用すると、この方法は使いにくくなります。この方法では

class Foo<T>{} 

class Bar{ 
    static void barfoo(Foo<Object> foo){} 
    public static void main(String[] args){ 
     barfoo(new Foo<Bar>()); // Doesn't compile 
    } 
} 

それはパラメータに入れることができる理由の下に表示ワイルドカードなし?

このメソッドの型パラメータは、Tです。extends Numberです。この型パラメータのおかげで、コンパイラは、そのメソッドに渡されたList<T>に数値が含まれることを知ります。

if? extends Numberなぜ、私は以下のように各ループに対して整数を持っていますか?

numbersInteger秒のListされていない場合は?その型パラメータはNumberまで拡張する必要があるだけなので、Doublesでもかまいません。またはLong s。あるいはBigDecimal秒です。

2

最初に、<T extends Number>と言うときに何をしているのかを説明しましょう。これがコンパイラの心の中で言っているのは、 "Numberクラスを拡張しなければならないジェネリックへの参照としてTを使う"です。したがって、最初の質問に対処するには、

最初のインスタンスでは、ワイルドカードのオブジェクトでどのように異なっていますか?
あなたは本当に何かをしていない、 "異なる"。あなたがやっているすべては「その総称を基準として 単語オブジェクトを使用して...」と言っている実際には、あなたがこれをやってみてくださいした場合:

public class Subclass<java.lang.Object extends Number> 

コンパイラが文句を言うだろう:Check class headers... parsing individual files failed!これは、あなたは実際にObjectを使用していませんが、という単語オブジェクトを使用しているためです。これに関するジェネリックスチュートリアルのType Parameter Naming Conventionsを参照してください。

他の2つの質問に対する回答は、dorukayhanの回答を参照してください。

関連する問題