什么是泛型?

泛型,即“参数化类型”。例如:定义方法时有形参,然后调用此方法时传递实参。参数化类型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

使用泛型有什么好处?(官方介绍)

1.类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

2.消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

3.潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

泛型的使用有哪些规则和限制?

1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String);

泛型使用场景:

底层框架API封装,方法的形参以及返回值参数。

Paste_Image.png
Paste_Image.png

泛型类和接口

以List为例:

Paste_Image.png

假设我们有三个类Animal、Dog、Cat,它们 的关系Dog extends Animal、Cat extends Animal

Paste_Image.png

对比结论:
1与2比较:当泛型类或接口指定类型,类型实参只能是指定类或其子类
1与3比较:当泛型类或接口不指定具体类型时,类型实参为Object。

泛型方法

语法:泛型声明必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前;可以声明多个泛型,用逗号隔开。

Paste_Image.png

通配符(上界、下界、无界)

上界

Paste_Image.png

简介:

上界通配符中的上界,指的是泛型内的类型,最高是Animal类,最低不限,只要是继承了Animal类,都可以通过编译,这也就是为什么叫 "上界",最高类型就是Animal类。

分析:

因为“? extends Animal”可代表Animal或其子类,上面的操作应该是可行的。事实上是”不行“,即无法通过编译。为什么呢?
在List list里只能添加Animal类对象及其子类对象(如Dog和Cat对象),在List里只能添加Dog类和其子类对象,不能添加Animal对象(不是Dog的子类)。

这里的List<? extends Animal>数据类型不定,如果传入的是List,这三个add操作是OK的,但是传入的是List或List会引发类型不兼容问题;Java为了保护其类型的一致性,不能往list添加任意对象的,不过却可以添加null

下界

14917534799002.jpg

简介:

下界通配符中的下界,指的是泛型内的类型,最低是Animal类,最高到超类Object,只要是Animal的父类,都可以通过编译,这也就是为什么叫 "下界",因为最低是Animal类。

分析 :

既然最低是Animal类,为什么animals.add(dog)和animals.add(cat)不报错呢?
Java多态,任何一个子类都可向上转型到父类。

无界

14917544546587.jpg
简介

“?”可以代表任意类型,也就是未知类型

通配符使用总结

上界通配符<? extends T> 指的是,引用内的泛型范围,最高是T类,最低不限
可以取元素
不能添加元素
下界通配符<? super T> 指的是,引用内的泛型范围,最低是T类,最高是超类Object
可以取元素,但是取出的元素是Object
可以添加元素,添加的元素,必须是T类或者其子类

以上属于原创文章,转载请注明作者@怪咖
QQ:208275451

Java泛型(类、接口、方法)及通配符相关推荐

  1. Java泛型进阶篇: 无界通配符、上界通配符以及下界通配符

    专栏文章导航 Java泛型入门篇: 泛型类.泛型接口以及泛型方法 Java泛型进阶篇: 无界通配符.上界通配符以及下界通配符 Java泛型原理篇: 类型擦除以及桥接方法 文章目录 前言 1. 无界通配 ...

  2. Java 调用第三方接口方法

    Java 调用第三方接口方法 一. 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1.通过统一资源 ...

  3. Java——String类的方法

    Java--String类的方法 String str1 = "abc" 与String str2 = new String("abc")有什么区别? 字符串常 ...

  4. java日历类add方法_Java日历computeTime()方法及示例

    java日历类add方法 日历类computeTime()方法 (Calendar Class computeTime() method) computeTime() method is availa ...

  5. java日历类add方法_Java日历computeFields()方法及示例

    java日历类add方法 日历类的computeFields()方法 (Calendar Class computeFields() method) computeFields() method is ...

  6. java日历类add方法_Java日历setFirstDayOfWeek()方法与示例

    java日历类add方法 日历类setFirstDayOfWeek()方法 (Calendar Class setFirstDayOfWeek() method) setFirstDayOfWeek( ...

  7. java日历类add方法_Java日历setMinimalDaysInFirstWeek()方法与示例

    java日历类add方法 日历类setMinimalDaysInFirstWeek()方法 (Calendar Class setMinimalDaysInFirstWeek() method) se ...

  8. java泛型与接口_Java泛型用于方法,类和接口

    什么是泛型? 型就是数据类型参数化.就是说原本定死的数据类型像方法中的形参一样,数据是不确定的,使用的时候由人传进去,泛型就是这样,数据类型不确定了.使用的时候再确定就可以了. 泛型的特点 是JDK1 ...

  9. 【Java 泛型】使用上下边界通配符解决泛型擦除问题

    文章目录 前言 一.使用上边界通配符示例 二.分析字节码的附加信息 前言 上一篇博客 [Java 泛型]泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通 ...

  10. java常用类的方法,java常用类的使用方法

    java常用类的使用方法 Interger:整数类型 1.属性. static int MAX_VALUE:返回最大的整型数: static int MIN_VALUE:返回最小的整型数: stati ...

最新文章

  1. 学计算机的男孩子怎么追女孩子,男孩子追女孩子的套路,原来有这么多,快来学一学...
  2. java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数
  3. Bootstrap Table列宽拖动的方法
  4. 配置csrf_django 入门第一课 配置文件
  5. mysql8安装fu_CentOS 8 安装 MySql并设置允许远程连接的方法
  6. 移动机器人参数校准的原由
  7. searchBar没有光标解决方法
  8. 基于麻雀搜索算法的极限学习机(ELM)分类算法-附代码
  9. OpenLayers自定义圆锥投影中国地图
  10. 如何把多个PDF页面合并成一页PDF - PDF页面合并器使用方法
  11. 知识产权助力中国经济高质量发展广受认可
  12. 通信知识宝典1 -- 如何让无线路由网速最快
  13. Win7 每天定时关机
  14. 做头条问答项目,月入4000元到底有多简单
  15. 不撞南墙不回头——浅谈深度优先搜索(DFS)
  16. 点餐系统Sprint1总结
  17. matlab 2018b 下载 (for Windows/Linux/Mac)
  18. 典型的NPN开关电路-待补充20211215
  19. 电力电子技术笔记—(AC-AC)变流电路
  20. 【读书笔记】《许三观卖血记》

热门文章

  1. 小米Android系统限制联网,Android 7 以上版本,绕过CA限制,抓取https
  2. 通讯与计算机网络作业,通讯与计算机网络作业平时作业(填空题问答和计算题)讲述.doc...
  3. php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...
  4. mysql服务器 配置文件,服务器上mysql编码配置文件
  5. java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解
  6. java编写八数码_java实现八数码
  7. html代码格式化nodejs,使用Node编写的Sublime代码格式化工具插件(HTML/CSS/JS)
  8. html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例
  9. java参数注解pam_CAS3.4 关于PAM模块SSL的详细配置
  10. windows下配置apache和php,Windows系统下Apache和PHP的安装和基本配置