我有一组共享一些共同属性的类,所以我让它们都扩展了一个共同的基类,BaseEntity
.所以我有,例如Foo extends BaseEntity
和 Bar extends BaseEntity
.
我还想要这些 Foo
的列表和 Bar
对象是可排序的,所以我实现了 Comparable
.我将类定义为 Foo extends BaseEntity implements Comparable<Foo>
和 Bar extends BaseEntity implements Comparable<Bar>
,以及 Foo
列表的排序s 或 Bar
s 按预期工作 - 当然,排序的细节在不同的子类中是不同的。但是当我事先不知道我是否会有 Foo
时,我不知道如何进行排序。 s 或 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
到它自己。
关于java - 如何在 Java 中对泛型类型列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14577910/