【问题标题】:Java Generic Inheritance / Generic ComparableJava 泛型继承/泛型可比
【发布时间】: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&lt;FourSidedShapes&gt; myshapes;

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

public class ShapeComparable<T extends Comparable<T>> {
   public abstract int compareTo(T other);
}

【问题讨论】:

  • 您的 Shape 类可能根本不应该实现 Comparable,因为它们似乎不是适用于所有形状的任何明确的自然排序。相反,您应该将 Comparator 传递给 TreeSet 构造函数。

标签: java generics inheritance


【解决方案1】:

我对你的问题并不完全清楚,但我假设你在问如何使 RectangleFourSidedShapes 实现 Comparable&lt;FourSidedShapes&gt;。 这是显示如何执行此操作的代码:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多