2017-06-04 83 views
1

說我有一個函數可以處理一系列形狀。我可以定義一些有用的類:Java通用繼承/通用可比較

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 {... } 

我有一個輔助容器:

//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) { } 
    ... 
} 

我願做這樣的事情:TreeSet<FourSidedShapes> myshapes;

如果我這樣做,我有兩個問題。首先,我想保持SortedLinkedList幫助器集合儘可能通用。所以我想寫一個實現,假設它將保持Shape或者一些形狀的子類(包括沒有被考慮/實現的對象,例如圓/三角形等等。但是如果我這樣做了,那麼我必須實現public int即使我真的只想實現public int compareTo(FourSidedShapes o),所以我的問題是,如何修改SortedLinkedListNode所以它擴展了compareTo,它不低於它存儲的基類,例如,如果我存儲形狀,那麼它需要形狀來實現Comparable<Shapes>如果我存儲FourSidedShapes,那麼它期望FourSidedShapes實現Comparable<FourSidedShapes> 。我懷疑正確的答案涉及到製作Comparable generic的參數,但我不確定它是什麼樣的。例如,像

public class ShapeComparable<T extends Comparable<T>> { 
    public abstract int compareTo(T other); 
} 
+4

你Shape類可能不應該實行可比可言,因爲它們似乎不被適用於各種形狀的任何清晰自然ordring。相反,您應該將一個Comparator傳遞給TreeSet構造函數。 –

回答

0

我不是你的問題完全清楚,但我假設你是問如何讓RectangleFourSidedShapes實現Comparable<FourSidedShapes>。 這裏是展示瞭如何做到這一點的代碼:

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; 
    } 

}