2013-03-10 152 views
2

最近,我看到了一个函数声明如下:这个java泛型意味着什么?

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

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

回答

2

我会采取刺。先从简单:

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

说你是排序类型T的名单,但,我们需要能够进行排序的TS,所以我们必须把它限制:

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

其中说你正在排序一个Ts的List,它是Comparable的一个子类。由于Comparable是一个接口,这实际上意味着它是一个实现Comparable接口的事物列表。但这是不够的。 Foo可以实现Comparable,其中Baz根本与Foo无关。因此,我们终于到达:

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

它说你整理TS的名单,其中T是指实现可比<任何类型的? super T> - 它可以通过T上的方法或T的某个祖先(超类)来比较两个Ts。这对于排序来说是必需的,因为排序需要比较排序过程中的项目。如果没有明确的比较器,唯一的方法就是让项目能够比较自己。比较器不需要在T本身上 - 如果有一个实现Comparable的超类,那也可以。

1

我们可以通过从左到右的步骤来弄清楚它的含义。

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

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

把它放在一起,你会得到像下面这样的语句:

通用接口,T,其延伸的可比类型高于T.

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

泛型的大多数限制都可以用这种方式解释,除了少数情况。如果你再次陷入困境,试着大声朗读 - 从左到右 - 并口头分析,看看到底发生了什么。