提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、案例分析
-
- 1.1 传统方式
- 1.2 使用泛型
- 二、泛型
-
- 2.1 概念
- 2.2 语法
-
- 2.2.1 声明
- 2.2.2 实例化
- 2.3 细节
- 2.4 自定义泛型类
- 2.5自定义泛型接口
- 2.6 自定义泛型方法
- 2.7 泛型通配符
- 三、拓展 - 泛型擦除
前言
本篇文章主要讲述JavaSE知识体系中的泛型部分的内容。
一、案例分析
为了引出泛型的使用,我们先给出一个简单的小案例,并使用传统的方式(无泛型)实现。案例如下:请使用ArrayList来存储三个Dog对象的信息,每个Dog对象包含两个属性:姓名name、年龄age,存储完毕进行遍历输出。
1.1 传统方式
先定义一个Dog类:
现在我们使用ArrayList来存储Dog对象并输出(不使用泛型):
分析代码,可以看到上述代码最直观的问题:
- :每次从容器中取出对象都需要进行一个向下转型的处理,一是比较麻烦,二是当容器中数据量比较大时会影响到程序执行的效率。
- :因为Object类是所有Java类的父类,那么可以向容器中加入任意类的对象。现我们创建Person类如下:
Person类的属性为:姓名name、地址address。现在我们往容器中加入Person类的对象:
可以看到编译器没有出现任何错误提示:
现在运行程序,发现控制台输出异常信息ÿjava基础247讲解1a;
使用传统方式无法对加入容器中的数据类型进行。
1.2 使用泛型
话不多说,先来一波泛型的快速体验。使用泛型创建容器的代码为:
当我们想再往dogList 中添加Person类的对象时,编译器会出现错误提示且程序无法编译通过:
因为已经使用了泛型约束了容器dogList 只能存储Dog类的对象,所以遍历处理时也无需再进行向下转型处理:
二、泛型
2.1 概念
2.2 语法
2.2.1 声明
在接口/类中声明泛型的方式为:
其中,字母T、K、V不代表值,而,字母的形式可以任意,一般常用T(Type)、K(Key)、V(value)等容易理解的形式。示例如下:
2.2.2 实例化
泛型声明以后,使用时需要在接口/类名后面指定类型参数的值(类型)。示例如下:
2.3 细节
1.public class Customer<K,V> 中的K、V。如下所示:
2. 在指定具体的泛型类型之后,可传入。示例如下:
我们约束容器animals 的数据类型为Animal类型,但是当我们传入Cat类的实例对象时,编译器也不会出现编译错误。
3.当没有指定具体泛型类型时,(参见案例部分)。
2.4 自定义泛型类
自定义泛型类的语法形式如下:
现自定义泛型类Person类如下:
使用自定义泛型类的注意事项如下:
1.普通成员可以使用泛型(属性、方法等)。示例如下:
2.使用泛型的数组,不能进行初始化(后文将会在章节中说明为什么不能初始化)。示例如下:
3.静态成员(属性、方法)不能使用泛型,示例如下:
4.泛型类的类型是在创建对象实例时确定的。
5.如果在创建对象时,没有指定泛型的类型,则默认为Object。
2.5自定义泛型接口
自定义泛型接口的基本语法格式为:
使用自定义泛型接口的注意事项如下:
3.同理,若没有指定类型则默认为Object。
2.6 自定义泛型方法
自定义泛型方法的语法格式为:
在方法调用时可确定泛型类型:
2.在中同样可使用自定义泛型方法,自定义泛型方法的泛型符号可以是自定义的,也可以使用泛型类的泛型符号。示例如下:
调用如下:
2.7 泛型通配符
Java中的泛型通配符提供了一种更为灵活的方式来处理泛型。泛型通配符主要有3种形式:
- 无界通配符:使用符号表示,表示可以接收任意类型。示例如下:
- 上界通配符:使用表示,表示可以是Type类型或者其子类类型。示例如下:
- 下界通配符:使用表示,表示可以是Type类型或者其父类类型。示例如下:
三、拓展 - 泛型擦除
Java中的泛型擦除是指Java编译器在将泛型类型参数从代码中(即擦除),并将其替换为原始类型或它们的上界(若未指定上界则为Object类型),即泛型信息在编译为字节码之后就了,实际的类型都当做Object类型来处理。编写示例代码如下:
查看字节码如下所示(IDEA可安装ASM Bytecode Outline插件):
- list.add(6)实际调用的是:当做Object类型存储。
- list.get(0)实际调用的是:取出为Object类型,但是做了一个强制类型转换,把Object类型转为Integer类型。
- JVM指令checkcast:用于执行的检查。该指令确保对象引用可以安全地从一种类型转换为另一种类型。如果在运行时无法执行该转换,则 checkcast 指令会抛出 ClassCastException。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/25445.html