项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

<T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到。例如在Collections中的sort方法:

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

很多人第一眼看到这个函数签名,都会有些疑惑,干嘛搞这么麻烦,这么声明不就好了么

<T extends Comparable<T>>

为什么非要声明成这么复杂的形式

<T extends Comparable<? super T>>

经过一番看书,搜索,搞明白了这样声明的目的。

1.<T extends Comparable> 和 <T extends Comparable<? super T>>的简单区别

<T extends Comparable<T>>

类型 T 必须实现 Comparable 接口,并且这个接口的类型是 T。

<T extends Comparable<? super T>>

类型 T 必须实现 Comparable 接口,并且这个接口的类型是 T 或 T 的任一父类。这样声明后,T 的实例之间,T 的实例和它的父类的实例之间,可以相互比较大小。

2.示例1

看一个很多地方都能找到的例子

public class Test1 {public static void main(String[] args) {Demo<GregorianCalendar> p1 = null; // 报错会}}class Demo<T extends Comparable<T>> {}

上述代码在IDE中会报错:
Error:(11, 14) java: 类型参数java.util.GregorianCalendar不在类型变量T的范围内。

为什么会报上面的错误呢?因为GregorianCalendar并没有实现Comparable接口。
如果将上面的代码稍作修改,就能正常运行:

public class Test1 {public static void main(String[] args) {Demo<GregorianCalendar> p1 = null;}
}class Demo<T extends Comparable<? super T>> {}

为什么现在没有问题?因为GregorianCalendar继承了Calendar类,而Calendar实现了Comparable接口。

通过上面的例子,很明显能看出来: <T extends Comparable<? super T>>这种声明的方式,不仅可以接受T类型,还可以接受T的父类型,这样类型参数对所传入的参数限制更少,提高了 API 的灵活性。

3.示例2

看另外一个例子

public class Test2 {public static <T extends Comparable<T>> void sort1(List<T> list) {Collections.sort(list);}public static <T extends Comparable<? super T>> void sort2(List<T> list) {Collections.sort(list);}public static void t1() {List<Animal> animals = new ArrayList<Animal>();animals.add(new Animal(20));animals.add(new Animal(30));List<Dog> dogs = new ArrayList<Dog>();dogs.add(new Dog(5));dogs.add(new Dog(10));sort1(animals);// sort1(dogs); 会报错sort2(animals);sort2(dogs);}
}class Animal implements Comparable<Animal> {public int age;public Animal(int age) {this.age = age;}public int compareTo(Animal other) {return this.age - other.age;}
}class Dog extends Animal {public Dog(int age) {super(age);}
}

上面的例子有两个类:Animal类实现了Comparable接口,Dog继承了Animal类。sort1方法的参数为<T extends Comparable<T>> ,sort2方法的参数为<T extends Comparable<? super T>>

sort1方法只能对List<Animal>类型的list进行排序,对于List<Dog>类型不能排序。
sort2方法因为方法签名的参数为<T extends Comparable<? super T>>,所以不管是List<Animal>类型还是List<Dog>类型,都可以!

java中的T extends Comparable ? super T相关推荐

  1. java comparable 泛型_Java泛型的应用——T extends Comparable? super T

    在观察Java源码的时候,发现了这么一个写法T extends Comparable super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着实让人有点 ...

  2. T extends ComparableT和T extends Comparable? super T含义

    <T extends Comparable<T>>表明T实现了Comaprable<T>接口,此条件强制约束,泛型对象必须直接实现Comparable<T&g ...

  3. Java中的两个关键字——super、this

    Java中的两个关键字--super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...

  4. JAVA中implement和extends的区别?

    我不理解: 在java中为什么把:extends和implements隔了开来,把其看成是独立的部分??? 而不采用C++中的,继承与多重继承都支持,??? 在java中 JAVA中implement ...

  5. Java implement意思_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 发布于 2020-4-14| 复制链接 摘记: 详解JAVA中implement和extends的区别extends是继承父类,只要那个类不是声 ...

  6. java中implement_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,Java中不支持多重继承,但是可以用接口来实 ...

  7. java泛型extends_java泛型extends和super详解

    java泛型extends和super详解 首先,Java有泛型这一个概念,是为了初衷是为了保证在运行时出现的错误能提早放到编译时检查.有了这个前提,再来看看题主的问题. // 编译会报错 // Li ...

  8. Java中static、this、super、final用法

    一.static 请先看下面这段程序: public class Hello{ public static void main(String[] args){ //(1) System.out.pri ...

  9. super是不是java中的标识符_java关键字super和this是什么?有什么区别?

    详细内容 本篇文章给大家带来的内容是介绍java关键字super和this是什么?有什么区别?,让大家了解关键字super和this的作用,关键字super和this的区别,以及简单介绍一下super ...

  10. java中的this.getclass和super.getClass(),以及继承的深入探究

    情况一.继承.多态中的this 在继承多态中: 1.对于方法的覆盖,new的谁就调谁,这就是多态. 2.对于成员变量的覆盖,this在哪个类就指向哪个类的成员变量,没有多态. 即方法有多态性,但是成员 ...

最新文章

  1. android 入门之一【开发环境搭建】
  2. 院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考
  3. Redis基本数据类型1--String
  4. VMware 创建开启虚拟机时候报错的解决方式
  5. 华强北二代悦虎1562M升级固件图文教程(详细多图文)
  6. 没有串口,如何打印单片机调试信息?
  7. C/C++ atof函数 - C语言零基础入门教程
  8. lazarus的动态方法和虚拟方法
  9. C++之继承探究(七):虚析构函数
  10. 【水题】完美数(打表)
  11. webgl天空盒边界缝隙_WebGL three.js进修笔记 法向量网格材质MeshNormalMaterial的引见和建立360度全景天空盒的要领...
  12. python音乐爬虫_Python爬虫实践 —— 4.好听音乐网轻音乐资源下载
  13. 帝国CMS 7.5仿《讲历史网》模板/优秀的历史网帝国CMS模板下载
  14. 景区大数据可视化交互系统-全方位旅游服务平台,打造景区信息数据管理分析平台
  15. 加权算数平均大于等于几何平均
  16. UltraCompare v21.00分析
  17. 干货!STABLE - 一种无监督高鲁棒性图结构学习框架
  18. mysql 数据库字符集转换_字符集介绍及mysql数据库编码转换
  19. 百家号自媒体的文章在哪个时间段发文效果比较好?
  20. 华为mate50pro和小米12ultea对比

热门文章

  1. [Spring]04_最小化Spring XML配置
  2. 关于unicode,mbcs,utf8,charset,encoding等相关概念的说明
  3. 从C# 3.0说以人为本(二)—— LINQ语法结构
  4. GitHub+Hexo 搭建个人网站详细教程(转载)
  5. Angular 2 Decorators - 2
  6. MySQL 5.6 关于登陆的初始化设置
  7. 一些控件中的属性。(未完)
  8. 使用应用心理学帮助软件工程师
  9. 《C#高级编程》笔记系列--点滴记录(持续更新中……)
  10. 问题处理:VMware Workstation和Device / Credential Guard不兼容