我有一组类都有一些共同的属性,所以我让它们都扩展了一个共同的基类,BaseEntity
. 所以我有,例如Foo extends BaseEntity
和Bar extends BaseEntity
。
我还希望这些Foo
和Bar
对象的列表是可排序的,所以我实现了Comparable
. 我将类定义为Foo extends BaseEntity implements Comparable<Foo>
and ,并且s 或sBar extends BaseEntity implements Comparable<Bar>
列表的排序按预期工作 - 当然,排序的细节在不同的子类中是不同的。但是当我事先不知道我是否会有s 或s时,我无法弄清楚如何使我的排序工作。例如,此代码无法编译:Foo
Bar
Foo
Bar
public class UtilityClass<T extends BaseEntity> {
...bunch of stuff...
List<T> values;
public List<T> sort() {
Collections.sort(values);
return values;
}
...more methods...
}
带有错误消息Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<T>). The inferred type T is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>
我认为问题在于我正在尝试对BaseEntity
对象列表进行排序,而BaseEntity
它本身并没有实现Comparable
. 但是现在我面临一个问题:使BaseEntity
对象与其他BaseEntity
对象具有可比性的唯一明智的事情是,但是当我添加implements Comparable<BaseEntity>
到时BaseEntity
,编译器告诉我我现在遇到了问题,因为我的Foo
类正在尝试同时实现Comparable<BaseEntity>
and Comparable<Foo>
,这显然是不允许。
我知道我可以通过放弃implements Comparable<Foo>
和只是实现来回避这个问题Comparable<BaseEntity>
,但是我的compareTo
方法将不得不进行丑陋的转换,我认为这正是使用泛型应该避免的那种问题。
我真正想做的是在签名中指定它的BaseEntity
所有子类都将是Comparable
,但仅限于同一子类的实例。
感激地接受任何帮助。谢谢!