从接口方法返回 Comparable
Returning a Comparable from an Interface Method
在Java中,只需使用return类型的Comparable
,就可以允许接口指定函数return一个Comparable
。但是,这并不是特别有用,因为不能保证此接口的两个不同实现 return Comparable
可以相互比较。有什么方法可以做到这一点吗?
为了说明我的问题,假设我们正在制作一个 class 来存储对象并自动 1) 对它们进行分组和 2) 对这些组进行排序。所以像:
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
都必须相互协作,但我无法提前知道它们会是什么,这一事实使情况变得更加复杂。
您也可以将 Comparable subclass 设为通用参数。
类似
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 与相同的分组 class,例如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
在Java中,只需使用return类型的Comparable
,就可以允许接口指定函数return一个Comparable
。但是,这并不是特别有用,因为不能保证此接口的两个不同实现 return Comparable
可以相互比较。有什么方法可以做到这一点吗?
为了说明我的问题,假设我们正在制作一个 class 来存储对象并自动 1) 对它们进行分组和 2) 对这些组进行排序。所以像:
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
都必须相互协作,但我无法提前知道它们会是什么,这一事实使情况变得更加复杂。
您也可以将 Comparable subclass 设为通用参数。
类似
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 与相同的分组 class,例如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