1. <T extends Comparable<? super T>>代表什么意思
extends后面跟的类型,如<任意字符 extends="">表示泛型的上限。示例代码如下:
import java.util.*; class Demo<T extends List>{} public class Test { public static void main(String[] args) { Demo<ArrayList> p = null; // 编译正确 //这里因为ArrayList是List的子类所以通过 //如果改为Demo<Collection> p = null;就会报错这样就限制了上限 } }
在理解了extends所表示的泛型的上限后,接下来介绍一下super的作用,它与extends相反,表示的是泛型的下限。
所以结合上述两点,我们来分析一下这句话整体代表什么意思。首先,extends对泛型上限进行了限制即T必须是Comparable<? super T>的子类,然后<? super T>表示Comparable<>中的类型下限为T!
2. <T extends Comparable<T>>
和 <T extends Comparable<? super T>>
有什么不同
接下来我们通过对比,使得大家对为何要这样编写代码有更加深刻的印象。
<T extends Comparable<T>>
它代表的意思是:类型T必须实现Comparable
接口,并且这个接口的类型是T。这样,T的实例之间才能相互比较大小。这边我们以Java中GregorianCalendar这个类为例。
import java.util.GregorianCalendar; class Demo<T extends Comparable<T>>{} //注意这里是没有? super的 public class Test { public static void main(String[] args) { Demo<GregorianCalendar> p = null; } }
这里编译报错,因为这里的<T extends Comparable<T>>相当于<GregorianCalendar extends Comparable<GregorianCalendar>>,但是GregorianCalendar中并没有实现Comparable<GregorianCalendar>,而是仅仅持有从Calendar继承过来的Comparable<Calendar>,这样就会因为不在限制范围内而报错
<T extends Comparable<? super T>>
它代表的意思是:类型T必须实现Comparable
接口,并且这个接口的类型是T或者是T的任一父类。这样声明后,T的实例之间和T的父类的实例之间可以相互比较大小。同样还是以GregorianCalendar为例。代码如下所示:
import java.util.GregorianCalendar; class Demo<T extends Comparable<? super T>>{} public class Test1 { public static void main(String[] args) { Demo<GregorianCalendar> p = null; // 编译正确 } }
此时编译通过,这里可以理解为<GregorianCalendar extends Comparable<Calendar>>