2016-03-03 51 views
-2

当使用Collections.sort(List<T> list)时,与List<Employee>,其中Employee是一个不扩展的类Comparable接口。仿制药 - 收集分类方法

直到看见以下编译错误

在类型Collections方法sort(List<T>)不适用的参数(List<Employee>)。

我不明白为什么T应该实现Comparable,它没有任何地方sort方法的方法参数指定。

更新:请停止downvoting。我一直认为只有方法参数决定了作为参数传递的内容,但我在方法签名中看到了<T extends Comparable<? super T>>,但在方法签名中看不到它。访问修饰符,静态或不是,返回类型,方法的名称是我知道的,但多余的是什么?

更新:我没有意识到这一点:“所有的泛型方法声明具有(<和>)由尖括号分隔的类型参数部分先于方法的返回类型”

+7

是的,它是:['public static > void sort(List list)'](https://docs.oracle。com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List%29) – resueman

+1

作为一般规则,如果您无法手动执行某些操作(即使缓慢:)),那么计算机也是如此。所以记住这一点:如果我给了你一个FooBars的列表,并且没有关于FooBar的信息,并要求你对它们进行排序 - 你会怎么做?这两个答案是为了让FooBar能够告诉你如何对自己进行排序(即它是Comparable)还是让你告诉我如何比较它们(即传入比较器)。 – yshavit

+0

我只是不明白'>'是在方法签名中。它不是访问修饰符,返回类型,方法名称,那么它是什么呢? – user2296988

回答

5

这里的完整签名:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

,你可以看到T必须实现Comparable否则怎么会sort()知道如何排序的List<T>

+0

什么是<方法签名中的>?它是用于声明泛型类型的特殊功能吗? – user2296988

+0

'>'意味着'T'类型实现了'Comparable'接口中声明的所有方法。 “Comparable”本身就是一个通用接口,它要求它操作的类型必须是“T”类型或“T”的超类。 – callyalater

4
public static <T extends Comparable<? super T>> void sort(List<T> list) 

如果你不知道哪个员工比另一个员工大,你不能排序。只需添加一个自定义的比较器。

0

对于诸如int,long,float等原始数据类型,比较是预定义的。 然后排序接受预定义的比较度量并对变量进行排序。

但是,当您创建一个类时,一个类可以由许多不同的基元类型和其他对象组成。 Java不能自动知道如何比较,所以它需要扩展可比的接口并定义指定如何排序的函数。对于例如

Class car { 
int id; 
String name; 
String company; 
} 

实施可比较后,您可以定义如果你的排序取决于车的名称,它的名称或公司名称。 希望这个清除需要一点。

0

对于泛型,有两种方法:1.通配符和2.有界类型参数。

实施例与通配符: public void sort(List<? extends T> list)

实施例具有有界类型: public static <T extends Comparable<? super T>> void sort(List<T> list)

有界类型是优选的时`T需要被使用一次以上,例如在上面的例子。