Java泛型继承/泛型比较

Java泛型继承/泛型比较,java,generics,inheritance,Java,Generics,Inheritance,假设我有一个函数,它用一系列形状来做事情。我可以定义几个有用的类: public abstract class Shape implements Comparable<Shape> { } public abstract class FourSidedShapes extends Shape { } public class Rectangle extends FourSidedShapes{ ... @Override public int compareTo

假设我有一个函数,它用一系列形状来做事情。我可以定义几个有用的类:

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 {... }
公共抽象类形状实现了{}
公共抽象类四边形扩展了形状{}
公共类矩形扩展了四边形{
...
@凌驾
公共整数比较(o形){
返回0;
}
}
公共类正方形延伸到四边形{…}
我有一个助手容器:

//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) { }
   ...
}
//实现双链接排序列表
公共类SortedLinkedListNode{
公共分类链接列表节点添加(TE){
公共T获取(E目标){}
...
}
我想这样做:
TreeSet myshapes

如果我这样做,我有两个问题。首先,我希望使SortedLinkedList帮助器集合尽可能通用。因此,我想在编写实现时假设它将保存Shape或Shape的某些子类(包括尚未考虑/实现的对象,如圆/三角形等),但如果我这样做,那么我必须实现public int compareTo(Shape o)对于矩形和正方形,即使我真的只想实现公共int compareTo(四边形o)因为我实际上只在我的集合中存储四边形的子类。所以我的问题是,如何修改我的SortedLinkedListNode,使其扩展一个compareTo,使其不低于它存储的基类?例如,如果我存储形状,那么它期望形状实现
Comparable
。如果我存储四个idedShapes,然后它期望FourSidedShapes实现
Compariable
。我怀疑正确的答案涉及将Compariable的参数设置为泛型,但我不确定这是什么样子。例如

public class ShapeComparable<T extends Comparable<T>> {
   public abstract int compareTo(T other);
}
公共类形状可比较{
公开摘要与其他文件进行比较;
}

我不完全清楚你的问题,但我假设你在问如何制作
矩形
四边形
实现
可比性
。 下面是显示如何执行此操作的代码:

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

}
公共抽象类Shape实现可比较的{}
公共抽象类四边形扩展了形状{
@凌驾
公共int比较(四边形o){
返回0;
}        
}
公共类矩形扩展了四边形{
@凌驾
公共int比较(四边形o){
返回0;
}
}
公共类广场延伸为四边形{
@凌驾
公共int比较(四边形o){
返回0;
}
}

我不完全清楚你的问题,但我假设你在问如何制作
矩形
四边形
实现
可比性
。 下面是显示如何执行此操作的代码:

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

}
公共抽象类Shape实现可比较的{}
公共抽象类四边形扩展了形状{
@凌驾
公共int比较(四边形o){
返回0;
}        
}
公共类矩形扩展了四边形{
@凌驾
公共int比较(四边形o){
返回0;
}
}
公共类广场延伸为四边形{
@凌驾
公共int比较(四边形o){
返回0;
}
}

您的形状类可能根本不应该实现Comparable,因为它们似乎不是应用于所有形状的任何清晰的自然排序。相反,您应该将Comparator传递给TreeSet构造函数。您的形状类可能根本不应该实现Comparable,因为它们似乎不是任何清晰的自然排序应用程序相反,您应该将一个比较器传递给TreeSet构造函数。