Angenommen, ich habe eine Funktion, die mit einer Liste von Formen arbeitet. Ich kann ein paar nützlichen Klassen definieren:Java Generische Vererbung/Generic Comparable
public abstract class Shape implements Comparable<Shape> { }
public abstract class FourSidedShapes extends Shape { }
public class Rectangle extends FourSidedShapes{
...
@Override
public int compareTo(Shape o) {
return 0;
}
}
public class Square extends FourSidedShapes {... }
Ich habe einen Helfer Container:
//Implements doubly-linked sorted list
public class SortedLinkedListNode<T extends Shape> {
public SortedLinkedListNode<T> add(T e) { }
public <E extends Shape> T get(E target) { }
...
}
Ich mag so etwas wie dies tun: TreeSet<FourSidedShapes> myshapes;
Wenn ich das tue, ich habe zwei Probleme. Erstens möchte ich die SortedLinkedList-Hilfssammlung so allgemein wie möglich halten. Also würde ich gerne die Implementierung schreiben unter der Annahme, dass sie Shape oder irgendeine Unterklasse der Form (einschließlich Objekte, die nicht berücksichtigt/implementiert wurden, wie Kreise/Dreiecke, etc.). Aber wenn ich das tue, dann muss ich public int implementieren compareTo (Shape o) für Rechteck und Quadrat, obwohl ich eigentlich nur public int compareTo (FourSidedShapes o) implementieren möchte, weil ich wirklich nur Unterklassen von FourSidedShapes in meiner Sammlung speichere, also meine Frage ist, wie ich meine SortedLinkedListNode modifiziere so dass es ein compareTo erweitert, das nicht niedriger als die Basisklasse ist, die es speichert? Wenn ich zum Beispiel Shapes speichere, erwartet es Shapes, um Comparable<Shapes>
zu implementieren. Wenn ich FourSidedShapes speichere, erwartet es FourSidedShapes, Comparable<FourSidedShapes>
zu implementieren Ich vermute, dass die richtige Antwort darin besteht, den Parameter Comparable generic zu machen, aber ich bin mir nicht sicher, wie das aussieht, zum Beispiel etwas wie
public class ShapeComparable<T extends Comparable<T>> {
public abstract int compareTo(T other);
}
Your Shape Klassen sollten wohl überhaupt nicht umsetzen Vergleichbar, da sie keine klare natürliche ordring zu allen Formen der Anwendung zu sein scheint. Stattdessen sollten Sie einen Vergleicher an den TreeSet-Konstruktor übergeben. –