2

次のコードを検討してください

/**
 * Generic method with bounds
 */
public static <T> int countGreaterThan(Comparable<T>[] anArray,
        T elem) {
    int count = 0;
    for (Comparable<T> e : anArray)
        if (e.compareTo(elem) > 0)
            ++count;
    return count;
}
/**
 * Alternative to above
 */
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray)
        if (e.compareTo(elem) > 0)
            ++count;
    return count;
}

どちらも機能的には同じようです。ただし、それらは明らかに互いにオーバーロードしている同じクラスに表示される可能性があります。次のコードを使用すると、2番目のメソッドが呼び出されるようです。2番目のオーバーロードメソッドがないと、最初のメソッドが呼び出されます。誰かが詳細な説明を提供できますか?

    Integer[] array = new Integer[10];
    for (int i = 0; i < array.length; ++i)
        array[i] = i;

    System.out.println("Count > 5 = " + countGreaterThan(array, 5));
4

3 に答える 3

2

まあ、それは完全な消去ではありません。

最初の方法

<T> int countGreaterThan(Comparable<T>[] anArray,T elem)

の配列で動作しますが、それも必須ではありComparable<T>ません。elemComparable

あなたはそれをチェックすることができます:

static class Y {
   int val;
   public Y(int val){
      this.val=val;
   }
} 

static class W extends Y implements Comparable<Y>{
   public W(int val){
      super(val);
   }
   public int compareTo(Y o){
      return this.val-o.val;
   } 
}

W[] array = new W[10];
for (int i = 0; i < array.length; ++i)
    array[i] = new W(i);

System.out.println("Count > 5 = " + countGreaterThan(array, new Y(5)));       

最初のメソッドが呼び出されます。

于 2013-02-05T10:43:50.440 に答える
1

(同じ消去がないため、同じクラスに表示できます。最初の引数にはタイプの最初の引数がComparable[]あり、2番目の引数にはタイプがありObject[]ます。)

どちらの方法も適用できます。Javaでは、呼び出すメソッドはコンパイル時に決定され、引数の参照型に基づいて常により具体的なオーバーロードになります。

カルロ・ペリグリーニは、最初のものが古いもののために呼ばれるであろうという良い点を述べていますComparable。より優れた専門家が私を訂正するかもしれませんが、これはボクシングによるものだと私はかなり確信しています。あなたの例の呼び出しは最初にバインドInteger[]されT[]、次にこれはボクシングを誘発intTますInteger。彼の例の場合Y、最初のものにしか一致しません。

于 2013-02-05T11:39:32.783 に答える
0

これは、JavaではanInteger[]もであるためComparable[]です。引数として配列の代わりにリストを使用する同じメソッドがある場合、aは。でList<Integer>はないため、同じようには機能しませんList<Comparable>。したがって、2番目のバージョンのみが引数としてを受け入れList<Integer>ます。

コレクションはタイプセーフであり、配列よりもジェネリックスでうまく機能します。一般に、配列よりもそれらを優先する必要があります。

于 2013-02-05T10:29:28.967 に答える