【发布时间】:2017-06-04 21:53:20
【问题描述】:
假设我有一个函数可以处理形状列表。我可以定义一些有用的类:
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矩形和正方形的 compareTo(Shape o) 即使我真的只想实现 public int compareTo(FourSidedShapes o) 因为我实际上只在我的集合中存储 FourSidedShapes 的子类。所以我的问题是,如何修改我的 SortedLinkedListNode以便它扩展一个不低于它正在存储的基类的 compareTo?例如,如果我正在存储形状,那么它期望形状实现 Comparable<Shapes>。如果我正在存储 FourSidedShapes,那么它期望 FourSidedShapes实现Comparable<FourSidedShapes>。我怀疑正确的答案涉及使 Comparable 的参数泛型,但我不确定那是什么样的。例如,类似
public class ShapeComparable<T extends Comparable<T>> {
public abstract int compareTo(T other);
}
【问题讨论】:
-
您的 Shape 类可能根本不应该实现 Comparable,因为它们似乎不是适用于所有形状的任何明确的自然排序。相反,您应该将 Comparator 传递给 TreeSet 构造函数。
标签: java generics inheritance