在看java容器类的时候经常可以看到<T extends Comparable<? super T>>,感觉十分不解?

我们觉得<T extends Comparable<T>>我们是知道的,T是实现了Comparable接口的类型,因此他们之间可以进行比较,

<? super T>表名类型参数需要是T或T的父类,那么<T extends Comparable<? super T>>到底是什么意思呢?

对T的约束是Comparable的子类,对Comparable中泛型的约束是,?至少是T的父类,那么就意味着T是?的子类。

一言以蔽之:元素必须是实现了Comparable接口的类或者其子类,可以使用父类方法比较子类型

/**
* Created by wangbin10 on 2018/9/18.
* mySort2() list中的元素必须是实现了Comparable接口的类或者其子类
* Java采取的是类型擦除的方法来实现泛型,并通过extends和super关键字来约束泛型的上界和下界。
* extends关键字用于确定泛型的上界。<A extends B>表示类B或者其子类。
* super关键字用于确定泛型的下界,<A super B>表示类B或者其父类,一直到Object。?则是一个通配符。
* 因此,<T extends Comparable<? super T>>表示了上界为实现了Comparable接口的类,<? super T>则表示实现Comparable接口的类的子类也可以,从而确定下界
*/
public class Test {
public static void main(String[] args) {
List<Animal> animals = new ArrayList<>();
animals.add(new Animal(25));
animals.add(new Dog(34));
mySort1(animals);//ok List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog(18));
dogs.add(new Dog(19));
/**
* 这个编译不能通过,因为T推断是Animal,得到的是Dog,Dog没有实现Comparable,所以不行
* mySort1(dogs);
* */ mySort2(animals);//ok
mySort2(dogs);//ok
} /**
* mySort1的类型参数是T extends Comparable<T>,他要求T必须实现Comparable
* @param list
* @param <T>
*/
public static <T extends Comparable<T>> void mySort1(List<T> list) {
Collections.sort(list);
System.out.println("mySort1 Success!");
} /**
* list中的元素必须是实现了Comparable接口的类或者其子类
* @param list
* @param <T>
*/
public static <T extends Comparable<? super T>> void mySort2(List<T> list) {
Collections.sort(list);
System.out.println("mySort2 Success!"); }
} class Animal implements Comparable<Animal> {
int age; public Animal(int age) {
this.age = age;
} @Override
public int compareTo(Animal o) {
return Integer.compare(this.age, o.age);
}
} /**
* Dog根本不能implements Comparable<Dog>,因为这样就会实现两个相同的接口
*/
class Dog extends Animal {
public Dog(int age) {
super(age);
}
}

最新文章

  1. 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
  2. android面试宝典
  3. Maven本地仓库及远程仓库
  4. Oracle中的正则表达式
  5. PyQt4学习资料汇总
  6. 推荐近期15个 Node.js 开发工具
  7. JSHint配置详解
  8. 兼容ie8 rgba()用法 滤镜filter的用法
  9. Solr学习笔记之1、环境搭建
  10. 基于vs2005以上版本Qt程序发布的注意事项(讲了manifest的问题)
  11. PHP创建XML文件讲解
  12. android模块化app开发-4为APP减负
  13. codeforces 704B - Ant Man 贪心
  14. Java设计模式偷跑系列(十二)组合模式建模和实现
  15. iOS面向对象的建模:MVC(OC基础)
  16. SmartRoute之远程接口调用和负载
  17. [译] Linux吃掉了我的内存
  18. 微机原理基础(五)—— MSP430
  19. Element表格嵌入复选框以及单选框
  20. Chapter 5 Blood Type——24

热门文章

  1. java 读取项目外面配置文件的方法
  2. C#中的反射总结
  3. poj 3071 可能DP
  4. RadioButton分组的实现
  5. HDU 4919 打表找规律 java睑板 map 递归
  6. Scatter matrix(散布矩阵)
  7. git 命令修改commit时的用户名和邮箱地址
  8. C/C++回调方式系列之一 函数指针和函数回调模式
  9. 如何把Go调用C的性能提升10倍?
  10. .net中模拟键盘和鼠标操作