Mi chiedo se ci sia mai un caso d'uso valida per il seguente:Dovrebbe comparabile mai comparare con un altro tipo?
class Base {}
class A implements Comparable<Base> {
//...
}
sembra essere un modello comune (vedi Collections per un certo numero di esempi) di accettare una collezione di tipo T
, dove T extends Comparable<? super T>
.
Ma sembra tecnicamente impossibile soddisfare il contratto di compareTo()
quando si confronta con una classe base, perché non c'è modo di garantire che un'altra classe non estenda la base con un confronto contraddittorio. Si consideri il seguente esempio:
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
}
}
Abbiamo due classi estendono Base
utilizzando paragoni che non seguono una regola comune (se ci fosse una regola comune, che sarebbe quasi certamente essere implementato in Base
). Eppure il seguente tipo rotta verrà compilato:
Collections.sort(Arrays.asList(new A(0), new B(1)));
Non sarebbe più sicuro per accettare soltanto T extends Comparable<T>
? O c'è qualche caso d'uso che convalida il carattere jolly?
Il mio istinto dice no (mele e arance e tutto il resto), ma l'unica ragione per cui "potresti" considerare questo è se non hai mai voluto confrontare le classi figlie in un modo diverso allora fai la classe genitore. Certo, potresti sempre chiamare semplicemente 'super.compareTo' invece – MadProgrammer
Penso che potresti voler chiarire un po 'il tuo titolo. Penso che la domanda più interessante sollevata nel tuo post sia "Perché i metodi in Collezioni dichiarati per funzionare su" T estende Comparable super T> "invece di" T estende Comparable "?" Ovviamente non è un gran bel titolo, ma penso che un titolo orientato come questo possa essere migliore. –
Others
So che Java 'enum's usa la loro classe base per un' Comparable'. Tutti gli 'enum' di Java derivano dalla classe di base' java.lang.Enum' che implementa 'Comparable', dove 'E' è la classe figlia (ad esempio, l'enumerazione che si utilizza). –
markspace