說我有一個函數可以處理一系列形狀。我可以定義一些有用的類: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);
}
你Shape類可能不應該實行可比可言,因爲它們似乎不被適用於各種形狀的任何清晰自然ordring。相反,您應該將一個Comparator傳遞給TreeSet構造函數。 –