如何在Java中对泛型类型列表进行排序

如何在Java中对泛型类型列表进行排序,java,generics,sorting,Java,Generics,Sorting,我有一组类,它们都共享一些公共属性,所以我让它们都扩展了一个公共基类,BaseEntity。例如,我有Foo扩展BaseEntity和Bar扩展BaseEntity 我还希望这些Foo和Bar对象的列表是可排序的,因此我实现了Comparable。我将类定义为Foo extends BaseEntity implements compariable和Bar extends BaseEntity implements compariable,并且Foos或Bars列表的排序工作与预期一样,当然,排

我有一组类,它们都共享一些公共属性,所以我让它们都扩展了一个公共基类,
BaseEntity
。例如,我有
Foo扩展BaseEntity
Bar扩展BaseEntity

我还希望这些
Foo
Bar
对象的列表是可排序的,因此我实现了
Comparable
。我将类定义为
Foo extends BaseEntity implements compariable
Bar extends BaseEntity implements compariable
,并且
Foo
s或
Bar
s列表的排序工作与预期一样,当然,排序的细节在不同的子类中是不同的。但是,当我事先不知道是使用
Foo
s还是
Bar
s时,我就不知道如何进行排序。例如,此代码无法编译:

public class UtilityClass<T extends BaseEntity> {

  ...bunch of stuff...

  List<T> values;

  public List<T> sort() {
    Collections.sort(values);
    return values;
  }

  ...more methods...
}
公共类实用类{
…一堆东西。。。
列表值;
公共列表排序(){
集合。排序(值);
返回值;
}
…更多方法。。。
}
错误消息
绑定不匹配:类型集合的泛型方法排序(列表)不适用于参数(列表)。推断类型T不是有界参数的有效替代品请尝试以下操作:

static <T extends Comparable<? super T>> sort(T[] array);

static使用交叉点类型,如下所示:

public class MyList<T extends BaseEntity & Comparable<T>> {...}
公共类MyList{…}

它指定T必须既是一个
基本实体
又是一个与自身可比的

不要使用
集合。排序(列表)
,使用
集合。排序(Lst,Comparator你可以制作一个超级简单的排序方法,可以处理几乎任何列表类型

public class Tools {

    public static <E> void sortList(List<E> list, Comparator<E> comparator) {
        Collections.sort(list, comparator); 
    }

    // Any other utility methods/resources you want in here

}
公共类工具{
公共静态无效排序列表(列表、比较器、比较器){
集合。排序(列表、比较);
}
//您希望在此处使用的任何其他实用程序方法/资源
}

这意味着您可以调用此方法对任何列表进行排序,只要给定的列表和比较器彼此具有相同的类型。即使没有您拥有的基类(BaseEntity),它也可以工作

我确信您希望对对象列表进行排序,而不是类型?因此您将有一个
Bar
列表或一个
Foo
列表,但不是两个列表都在同一个列表中?您的
MyList
模板会更复杂吗?如果不是,它看起来像是一个不必要的层,导致您的问题。是的,我的列表是
Foo
Bar
,是的,
MyList
只是显示问题的最小可能代码的一个示例。真正的类要复杂得多。
MyList
类只是显示错误消息的一个示例。我选择了一个坏名称:-(,这实际上不是一个任何东西的列表,这个类的实例只需要执行排序,而不是实际可排序。不过,我不明白为什么这会改变答案的适用性。:)因为java 5中的泛型是蹩脚的。错误“就像试图同时实现
Comparable
Comparable
,这显然是不允许的”明显地暗示了这一点。哦,是的,你是对的。
Comparable
适用于
T
,而不是
MyList
。谢谢。要获得最佳效果,请使用
Comparable
de>