从接口方法返回Comparable

时间:2015-09-16 13:37:52

标签: java interface comparable

在Java中,只需使用返回类型Comparable,就可以允许接口指定的函数返回Comparable。然而,这并不是特别有用,因为不能保证该接口的两个不同实现将返回可以相互比较的Comparable。有没有办法做到这一点?

为了说明我的问题,让我们说我们正在制作一个存储对象的类,并自动1)对它们进行分组,然后对这些组进行排序。如下所示:

GroupList.java

public class GroupList<T extends Groupable> {
  private HashMap<Comparable, T[]> data;
  public void add(T e) {
    Comparable group = e.getGroup();
    if(!data.containsKey(group)) { /* make new group for the element */ }
    /* add element to matching group */
  }
  public T[][] get() {
    /* return all the data, with the sets ordered by their Comparable */
  }
}

Groupable.java

public interface Groupable {
  public Comparable getGroup();
}

然而,这遇到了上述问题,这意味着这样的事情是可能的:

Class A implements Groupable {
  String datestamp;
  public Comparable getGroup() { return datestamp; }
}
Class B implements Groupable {
  Date datestamp;
  public Comparable getGroup() { return datestamp; }
}

虽然所有Comparable必须相互配合,但事实并非如此,我不知道它们会是什么。

1 个答案:

答案 0 :(得分:2)

您也可以使Comparable子类成为通用参数。

这样的东西
public interface Groupable<G extends Comparable<G>> {
  public G getGroup();
}

public class GroupList<G extends Comparable<G>> {
  private HashMap<G, Groupable<G>[]> data;
  public void add(Groupable<G> e) {
    G group = e.getGroup();
    if(!data.containsKey(group)) { /* make new group for the element */ }
    /* add element to matching group */
  }
  public Groupable<G>[][] get() {
    /* return all the data, with the sets ordered by their Comparable */
  }
}

在这种情况下,如果您有class A implements Groupable<String>class B implements Groupable<Date>,则不能将它们混合在同一个GroupList中,但您仍然可以将不同的类与相同的分组类混合,例如class C implements Groupable<String>

GroupList<String> groupList = new GroupList<String>();
groupList.add(new A()); //ok
groupList.add(new B()); //compile error
groupList.add(new C()); //ok