在Java中对未知类型的列表进行排序

vic*_*rio 2 java sorting generics java-8

我在一个方法中有这个列表:

List<? extends Object> objects;
Run Code Online (Sandbox Code Playgroud)

或者它也可以是:

List<?> objects;
Run Code Online (Sandbox Code Playgroud)

我想用Java 8 lambda这样排序:

objects.sort((p1, p2) -> p1.compareTo(p2));
Run Code Online (Sandbox Code Playgroud)

但它说:

方法compareTo(捕获#6-of?)未定义类型捕获#6-of?

我也尝试过泛型类型:

List<O extends Object> objects;
Run Code Online (Sandbox Code Playgroud)

但随后它说:

对于类型O,方法compareTo(O)未定义

我怎么能这样排序一个列表?我需要它在我的抽象类中,它通过反射识别列表字段,并且可以对其进行排序.

JEY*_*JEY 8

compareTo可用于实现Comparable接口的对象.如果你想这样做,你应该使用

List<? extends Comparable> objects;
Run Code Online (Sandbox Code Playgroud)

要获得干净的代码,请查看@Holger的答案

  • `名单<?extends Comparable>`指的是原始类型`Comparable`,但仍然不保证操作会成功.例如用`List <?试试吧?extends Comparable> list = Arrays.asList("foo",42)`... (4认同)
  • 如果它没有扩展,它将无法编译. (3认同)

Hol*_*ger 5

如果您有信心,列表中的所有元素都是可以相互比较的,也就是说,它们不仅仅是实现Comparable,而且Comparable<CommonBaseType>,例如,在实例StringInteger实例的情况下Comparable,您无法将a StringInteger两个类型的实例进行比较.你的列表,然后你可以绕过编译时检查使用

objects.sort(null);
Run Code Online (Sandbox Code Playgroud)

当然,绕过编译时类型检查的所有后果.