当前位置: 首页 / 技术分享 / 正文
民哥带你快速精通java泛型(四)

2022-10-21

泛型 list 表示 类型

  第四关 泛型之飞天遁地

  小伙伴们,泛型我们已经学到第四关了,是不是感觉泛型很强大啊!但是不要得意,泛型也有“软肋”,

  泛型在使用时,有时并不能随意指定任意类型,也就是说,泛型在使用时具有类型限制,具体体现为泛型之飞天 ;

  就是泛型的上限,泛型之遁地 ; 就是泛型的下限。

  来吧,我们一起来看一下泛型的上限和下限。

  在泛型上限和下限的分析过程中,我们会看到 ?符号经常出现,在这里 ?表示通配符,表示任意类型,小伙伴们需要注意一下喔。

  1.泛型通配符

  切记: ?表示通配符,表示任意的类型。

  如下代码:

  ArrayList list1 ;

  ArrayListlist2 = new ArrayList();

  ArrayListlist3 = new ArrayList();

  list1 = list2;// ? 表示 String类型

  list1 = list3;// ? 表示 Integer类型

  在这里,小伙伴一定要注意: ?这个符号神通广大,可以用来表示任意的泛型类型。

  上述代码中创建了一个带?泛型list1。

  如果把创建带String泛型的list2赋值为list1, 那么此时?表示String 类型

  如果把创建带Integer泛型的list3赋值为list1, 那么此时?表示Integer类型

  讲到这里,小伙伴基本上明白了?符号的含义了,通常 ?会出现在泛型的上限和下限定义中使用中,我们接下来看看?这个通配符,

  在泛型的上限和下限过程怎么使用的,let`s go。

  2.泛型的上限

  定义的基本语法:定义基本语法:类名或者接口名,那么此时 ?表示T类型,或者T的子类型

  我们通过一段List接口的源码来分析一下泛型的上限,源码如下:

  public interface Listextends Collection{

  /**

  * 方法作用:将一个集合 添加到 List中,

  * 这时集合的类型 ? extends E ,这里? 表示是E的子类类型,?的上限不能超过E

  */

  boolean addAll(Collection c);

  ----

  }

  代码演示:

  Listlist = new ArrayList();//创建一个集合: 泛型为Number

  Listson1 = new ArrayList() ;

  Listson2 = new ArrayList() ;

  Liststr_list = new ArrayList();

  list.addAll(son1);// ? 表示 Number,上限是Number

  list.addAll(son2);// ? 表示Long,Long是Number的子类

  // list.addAll(str_list);//编译报错: 原因 String 和 Number 没有继承关系

  泛型的上限,就是在使用泛型时,不能超过extends后面定义的类型,所以大家在使用时,一定要注意类型的子、父级关系。

  3.泛型的下限

  定义基本语法: 类名或者接口名,那么此时 ?表示T类型,或者T的父类型

  刚刚看了泛型的上限,那么下限对于小伙伴来说就会简单很多了。

  我们还是通过List集合来分析泛型的下限。

  比如:

  List list = new ArrayList();//创建一个集合

  list = new ArrayList();// ? 表示Integer

  list = new ArrayList();// ? 表示Number: Number是Integer的父类

  list = new ArrayList();// ? 表示Object: Object是Integer的父类

  // list = new ArrayList();//编译报错: ? 表示String: String和Integer没有关系

  泛型的下限,就是在使用泛型时,必须高于super后面的定义的类型,所以大家在使用时,一定要注意类型的父、子级关系

  闯关练习

  请描述 ? 通配符 在泛型中的具体使用(多选)。

  A:在定义泛型的上限时: 可以使用?通配符 表示 泛型的子类

  B:在定义泛型的下限时: 可以使用?通配符 表示 泛型的父类

  C:在定义泛型时,可以不用 ?通配符

  D: 以上说法都不对

  答案:

  ABC

 

分享: 更多

上一篇:民哥带你快速精通java泛型(三)

下一篇:

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
在线咨询
试听
入学教程
立即报名

Copyright 2011-2020 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号