2017-06-04 6 views
1

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); 
} 
+4

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. –

Antwort

0

Ich bin nicht ganz auf Ihre Frage klar, aber ich gehe davon aus, dass Sie fragen, wie Rectangle oder FourSidedShapes machen Comparable<FourSidedShapes> implementieren. Hier ist der Code, der zeigt, wie das tun:

public abstract class Shape< T extends Shape<T> > implements Comparable<T> { } 

public abstract class FourSidedShapes extends Shape<FourSidedShapes> { 

    @Override 
    public int compareTo(FourSidedShapes o) { 
     return 0; 
    }   
} 

public class Rectangle extends FourSidedShapes{ 

    @Override 
    public int compareTo(FourSidedShapes o) { 
     return 0; 
    } 

} 

public class Square extends FourSidedShapes{ 

    @Override 
    public int compareTo(FourSidedShapes o) { 
     return 0; 
    } 

}