2

最近看到一个函数声明如下:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    //....
}

谁能告诉我在 T 上为<T extends Comparable<? super T>>代码片段设置了什么限制。非常感谢!!!!

4

2 回答 2

2

我来一刀。从简单的开始:

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 的超类,那也很好。

于 2013-03-10T05:12:19.703 回答
1

我们可以从左到右逐步了解它的含义。

以 开头T extends Comparable,这意味着正在使用的通用接口必须扩展Comparable。请注意,因为T是扩展Comparable,它必须是一个接口,因此假设。

那么,Comparable<? super T>>这意味着Comparable<>部分)使用的类型必须是 的超类T

把它们放在一起,你会得到如下声明:

一个泛型接口 T,它扩展了类型比 T 更高的 Comparable。

在这里,“更高”是指超类。

对泛型的大多数限制都可以这样解释,除了少数极端情况。如果您再次卡住,请尝试大声朗读 - 从左到右 - 并通过口头将其分解以查看到底发生了什么。

于 2013-03-10T05:11:54.347 回答