[英]Generics - Collections sort method
当使用具有List<Employee>
Collections.sort(List<T> list)
,其中Employee
是一个不扩展Comparable
接口的类。
然后我看到以下编译错误
类型
Collections
的方法sort(List<T>)
不适用于参数(List<Employee>
)。
我不明白为什么T
应该实现Comparable
,在sort
方法的方法参数中的任何地方都没有指定T
更新:请停止投票。 我一直认为只有方法参数才能确定要作为参数传递的内容,但是我看到<T extends Comparable<? super T>>
方法签名中的<T extends Comparable<? super T>>
,但我在任何方法签名中都看不到。 访问修饰符,是否为静态,返回类型,方法名称对我来说是已知的,但是额外的一个是什么?
更新:我不知道这一点:“所有通用方法声明的类型参数部分均由方法返回类型之前的尖括号(<和>)分隔”
这是完整的签名:
public static <T extends Comparable<? super T>> void sort(List<T> list)
如您所见, T
必须实现Comparable
否则sort()
如何知道如何对List<T>
进行排序
public static <T extends Comparable<? super T>> void sort(List<T> list)
如果您不知道哪个雇员比另一个雇员大,就无法排序。 只需添加自定义比较器即可。
对于原始数据类型(例如int,long,float等),预定义了比较。 排序采用预定义的比较措施并对变量进行排序。
但是,当您创建一个类时,一个类可以由许多不同的原始类型甚至其他对象组成。 Java无法自动知道如何进行比较,因此它需要扩展可比较的接口并定义用于指定排序方式的函数。 例如
Class car {
int id;
String name;
String company;
}
实施可比性后,您可以定义您的排序是否取决于汽车的ID,其名称或公司名称。 希望这可以消除需求。
对于泛型,有两种方法:1.通配符和2.Bounded类型参数。
通配符示例: public void sort(List<? extends T> list)
有界类型的示例: public static <T extends Comparable<? super T>> void sort(List<T> list)
public static <T extends Comparable<? super T>> void sort(List<T> list)
像上面的示例一样,当需要多次使用`T时,最好使用有界类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.