泛型

泛型的引入

需求:打印集合中所有字符串的长度;

结论:

再使用集合时,因为集合中可以保存不同类型的数据,保存进入集合后不管什么类型的数据都会自动向上转型为Object类型,

所以实际使用时一般需要强制向下转型为原来的类型;一旦使用强制向下转型,就有可能会出现类型转换异常;

解决办法:

  1. 不对集合中保存的数据类型作限制,而是在使用时先判断数据类型是否正确;这种解决办法不好,因为违背了 谁的职责由谁负责 的原则;
  2. 在使用集合保存数据时一个集合对象只保存一种类型的数据;使用这种办法可以解决问题,但是怎么保证一个集合对象中只保存一种类型的数据呢?

靠程序员自觉是不行的,最好能有一种技术手段,强制要求一个容器只能保存一种类型的数据;

Java中从JDK5开始提供了这种手段,就是泛型技术;

泛型介绍

泛型,又叫做参数化类型(就是类型的变量),可以在编译期对数据类型(只能是引用数据类型)进行限制;

泛型的写法:

<类型的变量名>

泛型使用演示:

我们来使用泛型解决上面的问题:

使用List集合时给泛型传参的图解:

泛型技术,只是在编译期有效,编译后class中就没有泛型;
编译后泛型消失,又叫做泛型的擦除;

泛型只是一种在编译期对数据类型进行检查的技术,不仅仅用在集合技术中;

使用泛型,可以在编译期就对数据的类型进行强制检查,避免运行期出现类型转换异常,提高程序的健壮性。

https://www.zhihu.com/video/1069348635325665280


泛型的简单应用

需求:向集合中添加学生对象,要求按照学生的年龄进行从小到大排序

public 

https://www.zhihu.com/video/1069348709585883136


自定义泛型

根据泛型书写的位置,可以分为三种:

类的泛型,接口的泛型,和方法的泛型;

  • 泛型类

格式:

class 

需求:定义一个工具类,可以保存和获取一个任意类型的对象;

问题:

类上的泛型是一个变量,那么这个变量是什么时候赋值的呢?

类上的泛型就是这个类的非静态成员变量,所以是在创建这个类的对象的时候给泛型变量赋值;

使用泛型类需要注意:

  1. 静态函数不能使用类的泛型
  1. 如果一个类要定义多个泛型,都要写在同一个尖括号中,不同的泛型之间使用逗号隔开;

https://www.zhihu.com/video/1069348937093128192


泛型接口

类上可以定义泛型,接口上也可以定义泛型;

格式:

interface 

如果在定义一个接口时在接口上使用泛型,这个接口就成为泛型接口;

1、接口的泛型,在实现接口时可以确定;

此时,这个类并不是泛型类,而且这个接口中所有使用泛型的方法都不在使用泛型,参数的类型将直接固定下来,不在变化;

  1. 在一个类实现一个泛型接口的时候,可以不指定泛型的具体类型,就需要将这个类定义为泛型类;

类似这样,泛型通过接口实现或者说类的继承的方式,从接口转移到类上(或者父类转移到子类上),叫做泛型的传递;

https://www.zhihu.com/video/1069349108199915520


泛型方法

除了类和接口上可以定义泛型,方法上也可以定义泛型;

书写格式是:在函数的返回值类型前面加上泛型,如:

public  

定义在方法上的泛型,相当于这个方法中的一个局部变量,不能这个函数之外的地方使用;

注意:泛型就是类型的变量,定义在方法中的泛型就是定义在方法里的变量,是一个局部变量,所以其它函数中不能使用;

如果方法要接受的参数不确定,而且和类上的泛型不一致,就可以在方法上自己定义泛型;

练习:提供一个功能,向List集合中添加某种类型数据;

https://www.zhihu.com/video/1069349291189043200


泛型通配符

泛型中的通配符

练习:说出下面代码中泛型的实际类型;

public 

如果不知道具体的类型是什么,就要使用泛型的通配符表示,表示可以匹配不同的类型:

泛型的通配符,使用一个问号表示,格式是:

<?>

需求:定义功能,可以输出保存不同类型数据的List集合中的元素,

问题:

Java的泛型中,T和?有什么区别?

T表示是一个变量,不是一个具体的类型;

?表示通配符,可以匹配不同的类型,不是固定的一种类型;是一种值;

https://www.zhihu.com/video/1069349573805395968


泛型的上限和下限

如果具体类型不确定,但是只能是某种类型或它的子类,就可以使用泛型的上限,格式是:

<?  

如果具体类型不确定,但是只能是某种类型或它的父类,就可以使用泛型的下限,格式是:

<?  

注意:

集合中使用泛型的上限时,能够从集合中取数据,保存到上限类型或者Object类型;但是不能向集合中添加数据,因为不确定运行时传递过来的集合实际保存的数据的类型;

集合中使用泛型的下限时,可以向集合中添加下限类型或者下限类型的子类型的数据,但是不能从集合中取数据放到下限类型,因为很有可能集合中保存的是下限类型的父类型;

https://www.zhihu.com/video/1069350681604927488

泛型总结

  1. 泛型是一种在编译期就可以进行数据类型的检查的技术,只能检查引用类型的数据类型;
  2. 泛型使用一对尖括号表示:<标识符>;尖括号中的标识符,表示一个引用数据类型;
  3. 泛型可以定义在类、方法和接口上;
    1. 定义在类上:书写在类名后面,在创建类的实例对象时确定泛型的具体类型;在类中的非静态函数中可以使用;
    2. 定义在方法上:书写在方法的返回值类型前面,在方法调用时确定泛型的具体类型,静态和非静态函数都能定义;只能在当前定义的这个方法里使用;
    3. 定义在接口上:书写在接口名后面,实现接口时可以明确泛型的具体类型,或者通过泛型类,在创建类的对象时才明确具体类型;
  1. 泛型的通配符:当需要使用的泛型的数据类型是不确定的时候,就需要使用泛型的通配符;

通配符的写法:<?>

  1. 泛型的通配符的上限和下限:

    1. 在定义泛型的通配符的时候,如果只能匹配某个类或者这个类的子类,就需要使用通配符的上限,写法是:<? extends 上限的类型>
    2. 在定义泛型的通配符的时候,如果只能匹配某个类或者这个类的父类,就需要使用通配符的下限,写法是:<? super 下限的类型>

android 集成同一interface不同泛型_【Java视频教程】day30-泛型??相关推荐

  1. android 集成同一interface不同泛型_C# 基础知识系列- 10 反射和泛型(二)

    0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...

  2. android 集成同一interface不同泛型_Dig101:Go之读懂interface的底层设计

    Dig101: dig more, simplified more and know more 今天我们聊聊万物皆可为的接口(interface)底层设计. interface 被定义为一组方法的签名 ...

  3. java定义list_我的Java Web之路59 - Java中的泛型

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...

  4. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  5. Android为TV端助力 转载:Java 泛型

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest {2 3 public static void main(Strin ...

  6. java使用泛型后消除泛型_如何以及何时使用泛型

    java使用泛型后消除泛型 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. ...

  7. android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...

    ####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.i ...

  8. java模型给泛型_【一天一个基础系列】- java之泛型篇

    java 5以后,java引入了"参数化类型"的概念,允许程序在创建集合时指定集合元素的类型 java 7之前,如果使用带泛型的接口.类定义变量,那么调用构造器创建对象时构造器的后 ...

  9. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...

    如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...

最新文章

  1. [linux][c语言]用socket实现简单的服务器客户端交互
  2. 最近工作好忙,自己的软件又得落下很长一段时间了~
  3. SCAPY pcap文件数据分析 python3
  4. SpringBoot学习系列之一
  5. linuxPci驱动获取指定设备bus、device以及devfn数据方式
  6. javascript 创建对象方式
  7. 基数排序(稍微困难)
  8. 精挑细选的几个公众号,你值得拥有
  9. React - 修改children(下)
  10. socket连接测试工具,window和linux下
  11. ASO优化之新人必备的基础知识技能
  12. 复制一颗二叉树(java语言)
  13. sqlmap 清除缓存记录
  14. 测评三个数据分析工具后,我终于找到了小白都会的数据可视化
  15. 自媒体视频号博主个人兴趣认证怎么选择?
  16. Android实现下载文件(图片)显示进度
  17. H3C S7500E系列高端多业务路由交换机
  18. Android内核的编译和调试
  19. Vue + editor.Md 双向数据绑定Markdown编辑器(vue-editormd-wrap)
  20. 只想让你知道我喜欢你

热门文章

  1. 线程id 获取线程名称_016 线程及初步网络编程
  2. GB2312 UTF8 UCS2汉字编码对应表
  3. 饼图的引导线怎么加_4步学会EXCEL复合条饼图制作方法,让统计结果更直观!
  4. python init函数_在Python中解释类__init __()函数内部和外部的变量。
  5. 《c语言从入门到精通》看书笔记——第9章 函数
  6. python类的专有方法_Python——类的专有方法
  7. dict取值_Python基础数据类型「list、tuple、dict」
  8. 服务器芯片采购,服务器采购具体要求.pdf
  9. c语言图片raw保存,求指导,如何用c语言实现读取*.raw格式图像
  10. oracle数据库if else,[数据库]oracle中if/else的3种写法