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

接下来,我将结合代码跟大家分享一下我关于这里泛型应用的看法。

1.>代表什么意思

大家可以明白的是这里应用到了Java的泛型,那么首先向大家说明一下这里extends的作用

extends后面跟的类型,如表示泛型的上限。示例代码如下:

import java.util.*;class Demo{}public classTest

{public static voidmain(String[] args) {

Demo p = null; //编译正确//这里因为ArrayList是List的子类所以通过//如果改为Demo p = null;就会报错这样就限制了上限

}

}

在理解了extends所表示的泛型的上限后,接下来介绍一下super的作用,它与extends相反,表示的是泛型的下限。

所以结合上述两点,我们来分析一下这句话整体代表什么意思。首先,extends对泛型上限进行了限制即T必须是Comparable super T>的子类,然后 super T>表示Comparable<>中的类型下限为T!

2.  > 和 > 有什么不同

接下来我们通过对比,使得大家对为何要这样编写代码有更加深刻的印象。

>

它代表的意思是:类型T必须实现Comparable接口,并且这个接口的类型是T。这样,T的实例之间才能相互比较大小。这边我们以Java中GregorianCalendar这个类为例。

代码如下所示:

importjava.util.GregorianCalendar;class Demo>{}//注意这里是没有? super的

public classTest

{public static voidmain(String[] args) {

Demo p = null;

}

}

这里编译报错,因为这里的>相当于>,但是GregorianCalendar中并没有实现Comparable,而是仅仅持有从Calendar继承过来的Comparable,这样就会因为不在限制范围内而报错。

>

它代表的意思是:类型T必须实现Comparable接口,并且这个接口的类型是T或者是T的任一父类。这样声明后,T的实例之间和T的父类的实例之间可以相互比较大小。同样还是以GregorianCalendar为例。代码如下所示:

importjava.util.GregorianCalendar;class Demo>{}public classTest1

{public static voidmain(String[] args) {

Demo p = null; //编译正确

}

}

此时编译通过,这里可以理解为>!因为Calendar为GregorianCalendar 的父类并且GregorianCalendar 实现了Comparable,具体可以在API中进行查看!

3. 实例代码演示

代码如下所示:

importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;public classTest

{//第一种声明:简单,灵活性低

public static > void mySort1(Listlist)

{

Collections.sort(list);

}//第二种声明:复杂,灵活性高

public static > void mySort2(Listl)

{

Collections.sort(list);

}public static voidmain(String[] args)

{//主函数中将分别创建Animal和Dog两个序列,然后调用排序方法对其进行测试

//main函数中具体的两个版本代码将在下面具体展示

}

}class Animal implements Comparable{protected intage;public Animal(intage)

{this.age =age;

}//使用年龄与另一实例比较大小

@Overridepublic intcompareTo(Animal other)

{return this.age -other.age;

}

}class Dog extendsAnimal

{public Dog(intage)

{super(age);

}

}

上面的代码包括三个类:

Animal实现了Comparable接口,通过年龄来比较实例的大小

Dog从Animal继承,为其子类。

Test类中提供了两个排序方法和测试用的main()方法:

mySort1()使用>类型参数

mySort2()使用>类型参数

main()测试方法。在这里将分别创建Animal和Dog两个序列,然后调用排序方法对其进行测试。

3.1 对mySort1()进行测试,main方法代码如下所示:

//创建一个 Animal List

List animals = new ArrayList();

animals.add(new Animal(25));

animals.add(new Dog(35));//创建一个 Dog List

List dogs = new ArrayList();

dogs.add(new Dog(5));

dogs.add(new Dog(18));//测试 mySort1() 方法

mySort1(animals);

mySort1(dogs);

结果编译出错,报错信息为:

The method mySort1(List) in the type TypeParameterTest is not applicable for the arguments (List)

mySort1() 方法的类型参数是>,它要求的类型参数是类型为T的Comparable。

如果传入的是List程序将正常执行,因为Animal实现了接口Comparable。

但是,如果传入的参数是List程序将报错,因为Dog类中没有实现接口Comparable,它只从Animal继承了一个Comparable接口。

注意:animals list中实际上是包含一个Dog实例的。如果碰上类似的情况(子类list不能传入到一个方法中),可以考虑把子类实例放到一个父类 list 中,避免编译错误。

3.2 对mySort12()进行测试,main方法代码如下所示:

public static voidmain(String[] args)

{//创建一个 Animal List

List animals = new ArrayList();

animals.add(new Animal(25));

animals.add(new Dog(35));//创建一个 Dog List

List dogs = new ArrayList();

dogs.add(new Dog(5));

dogs.add(new Dog(18));//测试 mySort2() 方法

mySort2(animals);

mySort2(dogs);

}

这时候我们发现该程序可以正常运行。它不但能够接受Animal implements Comparable这样的参数,也可以接收:Dog implements Comparable这样的参数。

3.3 是否可以通过将Dog实现Comparable来解决问题?

由分析可得程序出现问题是因为Dog类没有实现接口Comparable,那么我们能否将该类实现接口Comparable来解决问题呢?

代码如下所示:

class Dog extends Animal implements Comparable{public Dog(intage)

{super(age);

}

}

结果程序编译报错,错误信息如下所示:

The interface Comparable cannot be implemented more than once with different arguments: Comparable and Comparable

意义是Dog类已经从Animal中继承了Comparable该接口,无法再实现一个Comparable。

若子类需要使用自己的比较方法,则需要重写父类的public int CompareTo(Animal other)方法。

4. 总结

对Animal/Dog这两个有父子关系的类来说:>可以接受List,也可以接收 List 。而>只可以接收 List所以,>这样的类型参数对所传入的参数限制更少,提高了 API 的灵活性。总的来说,在保证类型安全的前提下,要使用限制最少的类型参数。

java comparable 泛型_Java泛型的应用——T extends Comparable? super T相关推荐

  1. java comparable方法_JAVA 泛型 - ComparableT

    Comparable 接口已经泛型化了,所以实现 Comparable 的对象声明它可以与什么类型进行比较.(通常,这是对象本身的类型,但是有时也可能是父类.)public interface Com ...

  2. java 泛型嵌套泛型_Java泛型简介–第6部分

    java 泛型嵌套泛型 这是关于泛型的介绍性讨论的延续, 此处的先前部分可以在此处找到. 在上一篇文章中,我们讨论了关于类型参数的递归边界. 我们看到了递归绑定如何帮助我们重用了车辆比较逻辑. 在该文 ...

  3. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  4. java怎么使用泛型_java泛型 7 泛型的基本介绍和使用

    现在开始深入学习Java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用.泛型在java中,是一个十分重要的特性,所以要好好的研究下. 一.泛型的基本概念 泛型的定义:泛型是 ...

  5. java 1.8 泛型_Java 泛型详解

    原标题:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除 ...

  6. 什么是java泛型_java泛型背后是什么

    这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天就带着这几个问题一起看下: 举一个简单的例子: image.png 这里可以看出来 ...

  7. java模型给泛型_java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应 ...

  8. java contains 通配符_java 泛型通配符 extends, super

    关键字说明 ? 通配符类型 extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类 ...

  9. java传入通用泛型_java泛型

    1         泛型 1.1            泛型的作用 泛型有两种作用,一种是让接口或方式更通用,一种是限制作用. 第一种是一种是让接口或方式更通用,泛型和C++的模板很相似,有时在定义函 ...

最新文章

  1. 信号状态关_路由器要不要关?难怪信号越来越差
  2. 数据蒋堂 | 多维分析预汇总的功能盲区
  3. R语言应用实战-聚类分析以及k-means的优缺点
  4. 小李飞刀:SQL题目第二弹!
  5. 每天学一点flash(16) as3.0 与asp通信(3) 错误探究
  6. 从NIO到Netty开发
  7. Ubuntu用户及用户组管理命令
  8. 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉
  9. 程序员:请不要对我的代码指手画脚!
  10. 理解JavaScript中的多态
  11. 安卓机顶盒运行linux,全志 Allwinner A20 机顶盒刷入原生 Debian
  12. 埃森哲是如何系统化做好数据分析的
  13. EMC测试-基础2EMI测试_辐射发射
  14. 使用java压缩文件成zip——三种方式压缩文件速度对比
  15. mysql的event_mysql中event的用法详解
  16. 【渝粤教育】国家开放大学2018年秋季 8180-22T (1)畜禽生产概论 参考试题
  17. 计算机视觉(十一):Keras Pipline与自定义模型
  18. SAP:采购申请ME51N/ME52N/ME54N/ME57屏幕增强
  19. 利用Flash制作一个可以自由拨动的时钟模具
  20. 添加/删除Windows组件,点击没反应,DBC2000安装不了

热门文章

  1. 英语培训小程序开发功能
  2. JAVA API操作hive
  3. 如何使用HQL语句进行排序
  4. 计算机ppt听课记录,怎样写听课记录.ppt
  5. 想了解硬创IDC法则,看这49页干货PPT就够了
  6. 在 JavaScript 中将字符串转换为数字的 7 种方法
  7. 15个前端UI优秀框架
  8. 基于大恒相机SDK,二次开发
  9. H5 + vue 监听手机屏幕旋转及判断横竖屏
  10. 非常全的23种设计模式