假设我有一个函数可以处理一系列形状。我可以定义一些有用的类:

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

最佳答案

我对您的问题尚不完全清楚,但我假设您正在问如何使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;
    }

}

08-05 06:48