public abstract class A implements I, Comparable<A> {
// some variables and methods
@Override
public int compareTo(A o) {
return someVariable - o.someVariable;
}
}
Sie können keinen Konstruktor in A brauchen eine compareTo
Methode zu implementieren, und Sie haben einige Variablen bekommen Sie zum Vergleich verwenden. compareTo
ist nur eine Methode, also da Sie Methoden in A haben können, können Sie auch eine compareTo
Methode haben. Da ich nicht weiß, welche Variablen Sie haben oder welche Sortierreihenfolge Sie benötigen, müssen Sie die Methode selbst ausfüllen.
Auf der anderen Seite könnte es gut sein, einen Konstruktor in A zu haben, aber das ist eine völlig unabhängige Frage.
Edit: Ich habe nicht gedacht, dies zunächst durch: Sie natürlich wollen
Collections.sort(la);
Dies ist nicht so einfach zu tun, wie es klingen mag. Collections.sort()
ist eine generische Methode deklariert nach the docs als:
static <T extends Comparable<? super T>> void sort(List<T> list)
Dies bedeutet, dass der Compiler über einen Aufruf der Methode, glücklich zu sein, das erklärte Elementtyp der Liste ein, die für eine Art implementiert Comparable<U>
sein muss U
das ist entweder der Elementtyp oder ein Supertyp davon. Ihr Elementtyp ist I
und I
implementiert Comparable
nicht. Deshalb erhalten Sie die Fehlermeldung.
Die Lösung? Ich glaube nicht, dass die perfekte Lösung existiert.Vorausgesetzt, dass Sie nicht la
eine ArrayList<A>
deklarieren möchten, eine weitere Option ist zu erklären, dass I
vergleichbar ist:
public interface I extends Comparable<I>
Genau dies spricht mehr verspricht, über A
als wir erfüllen können. Wir können zwei A
Objekte vergleichen (auch wenn sie Instanzen von Unterklassen von A
sind), aber es könnte andere Implementierungen von I
geben, und wir können nicht wissen, wie man sie mit A
vergleicht. Ein Ausweg ist:
@Override
public int compareTo(I o) {
A oa = (A) o; // will throw ClassCastException if o is not an A
return someVariable - oa.someVariable;
}
Seit A
erstreckt I
und I
erstreckt Comparable<I>
, müssen wir jetzt erklären o
ein I
, kein A
. Wenn jemand uns eine fremde I
Implementierung gibt, werfen wir eine ClassCastException
, und die Sortierung würde diese an den Aufrufer weitergeben. Wir wissen jedoch, dass in Ihrer Liste alle Elemente Instanzen von Unterklassen A
sind, das wird also nicht passieren. Mit dem oben genannten funktioniert sowohl Ihr Anruf an S.sortBySome()
als auch sein Anruf an Collections.sort()
.
Wenn einige, was fehlt, ist die Methode geändert dann, wie die Idee ist es, die fehlende Einheit hinzuzufügen. –
Das Sortieren von Objekten Ihrer Klassen basiert auf Ihrer Logik. JVM kann es nicht magisch für Sie definieren. Sie müssen es irgendwo definieren. Wenn Sie die Vergleichsschnittstelle implementieren, müssen Sie die Vergleichslogik in der implwmwntation ihrer abstrakten Methode 'compareTo' definieren. Sie müssen die Implementierung für die Methode bereitstellen. Fügen Sie es hinzu, implementieren Sie die Logik für den Vergleich. Vielleicht können Sie entweder das Problem lösen oder Sie haben eine * aussagekräftige * und * spezifische * Frage. –
so muss ich implementieren public int compareTo (A 0) in Klasse A? – Asaf