最近看到一个函数声明如下:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
//....
}
谁能告诉我在 T 上为<T extends Comparable<? super T>>
代码片段设置了什么限制。非常感谢!!!!
我来一刀。从简单的开始:
static <T> void sort(List<T> list)
假设您正在对 T 类型的列表进行排序。但是,我们需要能够对 T 进行排序,因此我们必须将其限制为:
static <T extends Comparable> void sort(List<T> list)
这表示您正在对作为 Comparable 子类的 T 列表进行排序。由于 Comparable 是一个接口,这实际上只是意味着它是一个实现 Comparable 接口的事物的列表。但这还不够。Foo 可以在 Baz 与 Foo 完全不相关的情况下实现 Comparable。所以我们最终得到:
static <T extends Comparable<? super T>> void sort(List<T> list)
这表示您正在对一个 T 列表进行排序,其中 T 表示任何实现 Comparable<? super T> - 它可以通过 T 上的方法或 T 的某个祖先(超类)来比较两个 T。这是排序所必需的,因为排序需要在排序过程中比较项目。如果没有明确的比较器,唯一的方法是让项目能够比较自己。比较器不需要在 T 本身上 - 如果有一个实现 Comparable 的超类,那也很好。
我们可以从左到右逐步了解它的含义。
以 开头T extends Comparable
,这意味着正在使用的通用接口必须扩展Comparable
。请注意,因为T
是扩展Comparable
,它必须是一个接口,因此假设。
那么,Comparable<? super T>>
这意味着Comparable
(<>
部分)使用的类型必须是 的超类T
。
把它们放在一起,你会得到如下声明:
一个泛型接口 T,它扩展了类型比 T 更高的 Comparable。
在这里,“更高”是指超类。
对泛型的大多数限制都可以这样解释,除了少数极端情况。如果您再次卡住,请尝试大声朗读 - 从左到右 - 并通过口头将其分解以查看到底发生了什么。