假设我有一个函数可以处理一系列形状。我可以定义一些有用的类:
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或shape的某些子类(包括尚未考虑/实现的对象,例如圆形/三角形等),但是如果我这样做,则必须实现public int即使我真的只想实现public int compareTo(FourSidedShapes o),也可以同时对矩形和正方形进行compareTo(Shape o),因为我实际上只在集合中存储FourSidedShapes的子类。所以我的问题是,如何修改SortedLinkedListNode因此,它扩展了不低于其存储基类的compareTo?例如,如果我存储形状,则它期望形状实现
Comparable<Shapes>
。如果我存储FourSidedShapes,则它期望FourSidedShapes实现Comparable<FourSidedShapes>
。我怀疑正确的答案涉及到Comparable泛型的参数,但是我不确定那是什么样子。public class ShapeComparable<T extends Comparable<T>> {
public abstract int compareTo(T other);
}
最佳答案
我对您的问题尚不完全清楚,但我假设您正在问如何使Rectangle
或FourSidedShapes
实现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;
}
}