2

次のコードがあります

public static <T extends Comparable<T>> T max(List<T> list){
    Iterator<T> iter = list.iterator();
    ...
    // code for finding the max element in the list
    ...
 }

私の質問は、この場合、再帰型バインドの必要性は何ですか? 私の理解でT extends Comparable < T >は、それ自体Tとのみ比較できるということTです。これは、という事実から来ていますClass 'T' implements Comparable<T>

class MyClass implements Comparable<MyClass>{
}

ここで間違っている場合は、お気軽に修正してください。

では、実際に疑念を抱くようになると、なぜ指定する必要があるの< T extends Comparable < T > >でしょうか? 引数List<T>リストに同じタイプの要素が含まれる方法。つまり、 type のパラメーターを渡すとList < MyClass2 >、すべての要素が同じ型になりMyClass2ます。

では、再帰型バインドの意味は何ですか? 前もって感謝します。

4

2 に答える 2

4

なぜ指定する必要があるの<T extends Comparable<T>>ですか?Comparable では、実装クラスがそれ自体と比較可能である必要がないためです。理論的には次のように書くことができます

class Circle extends Shape implements Comparable<Integer> {
    ...
}

Comparable 自体はその制限を作成しないため、関数を作成するときに自分で制限する必要があります。ただし、指定された境界は、必要以上に制限的です。あなたは電話をかけることができました

public static <T extends Comparable<? super T>> T max(List<T> list) {
    ...
}

Tそれは、それ自体のスーパークラスに匹敵することを意味します。これが必要な理由は、rgettman の Fruit の例に示されています。Tは常にそれ自身と比較可能ですが、比較可能なものをそれ自体に関して定義する必要はありませんT

于 2013-05-14T17:38:32.830 に答える
3

Comparableサブクラスを強制的にスーパータイプにするクラス階層がある場合があります。たとえば、

class Fruit extends Comparable<Fruit>

したがって、 のすべての部分は のFruit別の部分と比較できFruitます。次に、あなたは持っています

class Apple extends Fruit ...
class Banana extends Fruit ...

各サブクラスは であるFruitため、それらは allComparable<Fruit>であり、notComparable<Apple>であり、notComparable<Banana>です。

これにより、次の中で最大値を見つけることができますFruit(おそらく悪い例です。最大のフルーツは何ですか?) List<Apple>

List<Apple> apples = getApples();
Fruit maximum = max(apples);

である必要はありませんList<Fruit>

コメントで指摘されているように、maxメソッドは次のようにすることをお勧めします。

public static <T extends Comparable<? super T>> T max(List<T> list){

そのため、次のそれぞれが機能します。

List<Apple> apples = getApples();
Apple maxAppleOfApples = max(apples);
Fruit maxFruitOfApples = max(apples);

List<Banana> bananas = getBananas();
Banana maxBananaOfBananas = max(bananas);
Fruit maxFruitOfBananas = max(bananas);

List<Fruit> fruits = getFruit();
Fruit maxFruitOfFruit = max(fruits);
于 2013-05-14T17:03:48.887 に答える