这个java泛型是什么意思?

时间:2013-03-10 04:31:49

标签: java generics

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

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

有人能告诉我对<T extends Comparable<? super T>>代码段的T设置了什么限制。非常感谢!!!!

2 个答案:

答案 0 :(得分:2)

我会刺伤。从简单开始:

static <T> void sort(List<T> list)

说你正在对类型为T的List进行排序。但是,我们需要能够对Ts进行排序,所以我们必须将其限制为:

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

其中说你正在对作为Comparable的子类的Ts列表进行排序。由于Comparable是一个接口,这实际上只是意味着它是一个实现Comparable接口的东西的List。但这还不够。 Foo可以实现Comparable,其中Baz根本不与Foo相关。所以我们最终得到:

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

其中说你正在排序Ts的列表,其中T表示实现Comparable的任何类型&lt;?超级T&gt; - 它可以通过T上的方法或T的某个祖先(超类)比较两个Ts。这对于排序是必要的,因为sort需要比较排序过程中的项目。没有明确的比较器,唯一的方法是让项目能够自己比较。比较器不需要在T本身上 - 如果有一个实现Comparable的超类,那也没关系。

答案 1 :(得分:1)

我们可以从左到右逐步解决这个问题。

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

然后,Comparable<? super T>>表示Comparable<>部分)使用的类型必须是T的超类。

将所有内容放在一起,您会得到如下声明:

  

通用接口T,它扩展了比T更高类型的Comparable。

这里,“更高”意味着超类。

除了一些极端情况外,对泛型的大多数限制都可以这种方式解释。如果你再次陷入困境,请尝试从左到右大声读出 - 然后用语言将其分解,看看到底发生了什么。