次の有効なユースケースは、これまであります場合、私は思ったんだけど:他のタイプと比較することは可能でしょうか?
class Base {}
class A implements Comparable<Base> {
//...
}
どこT extends Comparable<? super T>
、タイプT
のコレクションを受け入れるために(例数のCollectionsを参照)一般的なパターンのようです。
しかし、基本クラスと比較するとcompareTo()
の契約を履行することは技術的に不可能です。なぜなら、別のクラスが矛盾した比較でベースを拡張しないようにする方法がないからです。次の例を考えてみましょう:
class Base {
final int foo;
Base(int foo) {
this.foo = foo;
}
}
class A extends Base implements Comparable<Base> {
A(int foo) {
super(foo);
}
public int compareTo(Base that) {
return Integer.compare(this.foo, that.foo); // sort by foo ascending
}
}
class B extends Base implements Comparable<Base> {
B(int foo) {
super(foo);
}
public int compareTo(Base that) {
return -Integer.compare(this.foo, that.foo); // sort by foo descending
}
}
我々は(一般的なルールがあった場合、それはほぼ確実Base
に実装されるだろう)共通ルールに従わない比較を使用してBase
を拡張する2つのクラスを持っています。しかし、次の壊れた並べ替えがコンパイルされます:
Collections.sort(Arrays.asList(new A(0), new B(1)));
はそれだけでT extends Comparable<T>
を受け入れるために、より安全ではないでしょうか?または、ワイルドカードを検証するユースケースがいくつかありますか?
私の腸はいいえ(リンゴやオレンジなど)はありませんが、これを考慮する可能性がある唯一の理由は、親クラスを別の方法で子クラスと比較したかったことがない場合です。もちろん、あなたはいつも 'super.compareTo'を呼び出すことができます – MadProgrammer
あなたのタイトルをいくらか明確にしたいと思うかもしれません。あなたのポストで提起されたより興味深い質問は、 "T extends Comparable"ではなく、 "T extends Comparabably super T>"で動作すると宣言されたコレクションのメソッドはなぜですか?明らかに、それは素晴らしいタイトルではありませんが、私はそのような方向性指向のタイトルが良いと思う。 –
Others
私はJavaの 'enum'が' Comparable'のために基本クラスを使用していることを知っています。すべてのJavaの 'enum'は' Comparable 'を実装する' java.lang.Enum'基底クラスから派生します。ここで 'E'は子クラスです(あなたが使用するenum)。 –
markspace