我有一组都共享一些公共(public)属性的类,因此我使它们都扩展了一个公共(public)基类BaseEntity
。所以我有例如Foo extends BaseEntity
和Bar extends BaseEntity
。
我还希望这些Foo
和Bar
对象的列表可排序,因此我实现了Comparable
。我将类定义为Foo extends BaseEntity implements Comparable<Foo>
和Bar extends BaseEntity implements Comparable<Bar>
,对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>
和Comparable<Foo>
,显然是不允许的。我知道我可以通过删除
implements Comparable<Foo>
并仅实现Comparable<BaseEntity>
来回避此问题,但是然后我的compareTo
方法将不得不进行难看的强制转换,并且我认为使用泛型确实可以避免这种问题。我真正想做的是在
BaseEntity
的签名中指定其所有子类均为Comparable
,但仅适用于同一子类的实例。非常感谢您提供的任何帮助。谢谢!
最佳答案
使用交叉点类型,如下所示:
public class MyList<T extends BaseEntity & Comparable<T>> {...}
这指定T本身必须同时是
BaseEntity
和 Comparable
。