Ich frage mich, ob es überhaupt ein gültiger Anwendungsfall ist für den folgenden:Soll Vergleichbar jemals mit einem anderen Typ verglichen werden?
class Base {}
class A implements Comparable<Base> {
//...
}
Es scheint ein gemeinsames Muster zu sein (Collections für eine Reihe von Beispielen sehen) eine Sammlung von Typ T
, wo T extends Comparable<? super T>
zu akzeptieren .
Aber es scheint technisch unmöglich, den Vertrag von compareTo()
im Vergleich zu einer Basisklasse zu erfüllen, weil es keine Möglichkeit gibt sicherzustellen, dass eine andere Klasse die Basis nicht mit einem widersprüchlichen Vergleich erweitert. Betrachten Sie das folgende Beispiel:
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
}
}
Wir haben zwei Klassen erstrecken Base
anhand von Vergleichen, die eine gemeinsame Regel nicht folgen (wenn es eine gemeinsame Regel, wäre es mit ziemlicher Sicherheit in Base
umgesetzt werden). Doch die folgende gebrochene Art kompiliert:
Collections.sort(Arrays.asList(new A(0), new B(1)));
Wäre es nicht sicherer sein, nur T extends Comparable<T>
zu akzeptieren? Oder gibt es einen Anwendungsfall, der den Platzhalter validieren würde?
Mein Bauch sagt Nein (Äpfel und Orangen und all das), aber der einzige Grund, warum Sie dies als "möglich" betrachten, ist, wenn Sie die Kindklassen NIEMALS auf eine andere Weise vergleichen wollten als die Elternklasse. Natürlich könntest du immer nur 'super.compareTo' nennen, statt – MadProgrammer
. Ich denke, du möchtest deinen Titel vielleicht etwas klarstellen. Ich denke, die interessantere Frage, die in Ihrem Beitrag aufgeworfen wird, lautet: "Warum sind Methoden in Sammlungen, die deklariert werden, um zu arbeiten?" T extends Comparable super T> "anstelle von" T extends Comparable "?" Natürlich ist das kein großartiger Titel, aber ich denke, ein Titel, der so orientiert ist, könnte besser sein. –
Others
Ich kenne Java 'enum's benutzen ihre Basisklasse für ein' Comparable'. Alle Java 'Enum's sind von der Basisklasse' java.lang.Enum' abgeleitet, die 'Comparable 'implementiert, wobei' E' die Kindklasse ist (d. H. Die von Ihnen verwendete Enumeration). –
markspace