完全なコンテキスト:
public class RClass<T extends Comparable<T>>
タイトルのステートメントは、メソッドにプラグインされる引数が、Comparable ORの派生クラスの1つを実装するクラスのオブジェクトでなければならないことを意味しますか?
ありがとう。
つまり、型パラメーターは、Comparableインターフェースを介して、独自の型の他のインスタンスとの比較をサポートする必要があります。
このようなクラスの例は、Oracleチュートリアル Object Ordering で提供されています。以下の抜粋のT extends Comparable<T>
と同様のパターンに注意してください。
public class Name implements Comparable<Name> {
...
public int compareTo(Name n) { ... }
}
Java-の意味<T extends Comparable<T>>
?
a)Comparable <T>
は汎用インターフェースです(「インターフェース」、つまり「クラス」ではないことに注意してください)
b)extends
は、クラスまたはインターフェースからの継承を意味します。
上記のポイント#aから、それはインターフェイスです。(「クラス」ではなく「インターフェイス」からの継承であることを忘れないでください)
c)上記の両方のポイント#aおよび#bから、
ここで、「1つのインターフェース」は「別のインターフェース」を拡張します。
このクラス用に定義されたインターフェイスが必要です。
interface MinMax<T extends Comparable<T>> {
T min();
T max();
}
d)クラス、つまりpublic class RClass {}
SHOULD
1#この「汎用インターフェース」を「実装」するComparable<T>
.. !!!
例:public class RClass<T> implements Comparable<T>
2#ORインターフェイスを作成し、この「汎用インターフェイス」に拡張Comparable<T>
例:
interface MinMax<T extends Comparable<T>> {
T min();
T max();
}
class RClass<T extends Comparable<T>> implements MinMax<T> {
.....
.....
}
ここで、型パラメーターTがRClassによって宣言され、MinMax
に渡される方法に特に注意してください。 MinMax
はComparable
を実装する型を必要とするため、実装クラス(この場合はRClass)は同じ境界を指定する必要があります。さらに、この境界が確立されると、implements句で再度指定する必要はありません。
そのクラスのどこかで、プログラマは次のようなものを書く必要があります
if(t.compareTo(othert) < 0) {
...
}
それが機能するためには、型Tが型Tの別のオブジェクトと比較するcompareToメソッドを持っている必要があります。Comparableを拡張すると、とりわけそのようなメソッドの存在が保証されます。
はい、Comparable
[〜#〜]から派生したクラスのオブジェクトは[〜#〜]Comparable
オブジェクト。継承はis-a
関係。
つまり、RClass
のインスタンスは、Comparable<T>
を文字通り完全に拡張する型でのみ作成できます。したがって、
RClass<Integer> a;
Integer
はComparable<Integer>
を拡張するため、許容されますが、
RClass<Object> b;
Object
は比較可能なクラスではないため、そうではありません。
==> guhanvj、<T extends Comparable<T>>
という意味です <T>
の上限はComparable<T>
オブジェクト。そう <T>
には、すべてがComparable<T>
自然順序付けのためのインターフェース。
簡単に言えば、compareToを実行するには、ジェネリック型Tが比較可能でなければなりません。そうしないと、T.compareToを実行できません。項目28の有効なJavaでは、"always use Comparable<? super T> in preference to Comparable<T>. <T extends Comparable<? super T>>"