最近,我看到了一个函数声明如下:这个java泛型意味着什么?
public static <T extends Comparable<? super T>> void sort(List<T> list) {
//....
}
谁能告诉我是什么限制了<T extends Comparable<? super T>>
代码段设置于T。非常感谢!!!!
最近,我看到了一个函数声明如下:这个java泛型意味着什么?
public static <T extends Comparable<? super T>> void sort(List<T> list) {
//....
}
谁能告诉我是什么限制了<T extends Comparable<? super T>>
代码段设置于T。非常感谢!!!!
我会采取刺。先从简单:
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的超类,那也可以。
我们可以通过从左到右的步骤来弄清楚它的含义。
开始与T extends Comparable
,这意味着正在被使用的通用接口必须扩展Comparable
。请注意,因为T
正在延伸Comparable
,它必须是一个接口,因此是假设。
然后,Comparable<? super T>>
这意味着Comparable
(<>
部分)使用的类型必须是T
的超类。
把它放在一起,你会得到像下面这样的语句:
通用接口,T,其延伸的可比类型高于T.
这里,“高”意味着超类。
泛型的大多数限制都可以用这种方式解释,除了少数情况。如果你再次陷入困境,试着大声朗读 - 从左到右 - 并口头分析,看看到底发生了什么。