2017-02-23 79 views
2

我有这个列表中的方法:排序名单未知类型的Java

List<? extends Object> objects; 

或者它也可以:

List<?> objects; 

我想这种方式排序,与Java 8拉姆达:

objects.sort((p1, p2) -> p1.compareTo(p2)); 

但它说:

对于类型 capture#6-of的方法compareTo(capture#6 of?)未定义。

我也试图与泛型类型:

List<O extends Object> objects; 

但随后说:

方法的compareTo(O)是不确定的O型

如何我可以像这样排序吗?我需要它在我的抽象类中,通过反射来识别列表字段,并且可以对它进行排序。

+5

您只能比较实现Comparable接口的类型。 – kamehl23

回答

8

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

List<? extends Comparable> objects; 

对于一个干净的代码检查@Holger回答

+0

谢谢!如果它不是从那个延伸出来的话,它会抛出一个异常吗?当我将对象转换为列表<?扩展Comparable> – victorio

+3

如果它不扩展它将不会编译。 – JEY

+4

'List <?扩展Comparable>'指的是原始类型'Comparable',但仍不能保证操作成功。例如。试着用'List <?扩展Comparable> list = Arrays.asList(“foo”,42)'... – Holger

5

如果你有信心,该列表中的所有元素都是相互比较,也就是说,他们不是仅实施Comparable,还有Comparable<CommonBaseType>,例如而StringInteger实例是Comparable,你不能比较与Integer一个String,不得有两种类型的实例在列表中,那么你可以使用

objects.sort(null); 
当然

绕过编译时检查,所有绕过编译时类型检查的后果。