当前课程知识点:Java程序设计 > 第三章 类的重用 > 3.5-泛型 > 3.5-泛型
大家好
欢迎回来继续学习
JAVA语言程序设计
接下来这一节呢
我们还学习泛型
泛型的本质就是将类型参数化
在JAVA程序中
我们不仅可以将数据
设置为参数
类型也是可以作为参数的
这样的话程序就更为通用了
我们可以有泛型的类
泛型的方法以及泛型的接口
接口会在下一讲给大家介绍
接下来我们就通过一个例题
来看看什么是泛型的类
和泛型的方法
在这儿呢,这个general type类
我们把它声明为泛型类
看看在这个尖括号里面呢
有一个泛型参数
实际上是一个类型参数
不仅数据可以作为参数
类型也可以作为参数的
也就是说我们实际使用
这个generaltype类的时候呢
是需要给出一个类型实参的
然后根据类型实参呢
能够确定这一次使用generaltype类
它里面的属性是什么类型的
它的方法处理的是什么类型的数据
方法的反馈
这是什么类型的
都要根据类型的实参来确定
然后现在我们来测试一下
在这个测试程序中呢
我们构造一个generaltype对象
构造的时候
由于它是泛型类
我们需要给出类型实参
比如说这次给出的是Integer
第二次构造generaltype对象的时候
给出的类型实参是double
那么这个引用i和引用d
它们指向的这两个对象
实际上就是完全不同类型的对象了
虽然都是通过generaltype构造的
但是给的类型实参不一样
那么对象里面的属性类型
以及它的方法所处理的类型
就会不一样
那i这个引用指向对象
它是用Integer这个类型实参
来构造的
那么当然它调用object
obj这个方法 返回的类型呢
就应该是Integer类型
所以我用类型转化方式
还是把它转成Integer类型
所以原来类型没有问题
可是这一行呢就会出错
为什么
因为d这个引用
说指向的对象
它是用类型实参double
这个类型实参来构造的
generaltype对象
所以它的obj返回的
就会是一个什么
是一个double对象
那么如果你硬要将它转换成Integer
那是没法转换的
所以会出现编译错误
所以我们看到了吧
如果说你使用类型参数的话
可以用一个泛型类
构造出不同类型的对象来
而且编译的时候
可以帮我们来做类型检查
现在来看这个泛型方法的例子
泛型方法呢
就是我们在声明这个方法的时候
我们可以让方法所接受的参数
或者方法体里面所处理的数据
它的类型可定制
现在我们用type来作为类型参数
那么这个方法体中
是调用参数的getclass方法
取得参数所属类这个对象
然后得到它的类名
调用name方法得到类名去输出
我们看测试一下
在调用的时候
我们给它的实参类型是不同的
那么根据实参类型
就可以反推回来
这次调用我们希望type是什么类型
然后可以正确的去取得
这个类型的它的类对象
然后得到它的类名输出
在使用泛型的基础上呢
我们还可以使用问号作为通配符
这样的话这个程序的通用性
就会更好
请看接下来这个例题
如果在使用泛型类的时候
配合使用通配符
就是这个问号符号
就能够使这个程序更为通用
我们看这个generaltype
是一个泛型类
在这个基础上呢
我们定义另外一个类ShowType
它接收的参数
它的show方法
接收的参数是什么呢
是你用generaltype
给它不同的类型实参
然后构造的对象
我们看一下这个测试程序
和运行结果
大家就知道什么意思了
比如说在这儿
我们构造一个generaltype对象
给它 第一次给它类型实参
是Integer
所以这一次构造的这个对象里面
容纳的这个属性
以及它的方法处理的类型
就是Integer的对象
好 它的引用给的i
第二次又用String作为实参
去构造一个对象
那这个时候构造的
这个generaltype对象
里面容纳的就是一个字符串
一个String对象
它的方法处理的就是String对象
这个引用用来初始化这个s
所以这个引用i 引用s
它指向的两个是完全不同的对象
虽然都是用generaltype
这个泛型类构造出来的
但是里面容纳的这个object类型
是不一样的
所以它是完全不同的对象
而我们用i 用s作为参数
都可以正确的调用show方法
而且运行的时候看到
正确的显示出它们各自的类型了
那这就是在泛型类中
使用通配符
它的效果使得程序就更为通用了
虽然我们可以使用泛型的机制
将类型参数化
这个时候好像我们只要
写一个算法
就可以普世性的
用这个算法去处理
所有类型的对象
其实大家想一想怎么可能呢
但凡这个算法中有点复杂计算
它都不可能让这样的计算
去普世性的适合
所有不同类的对象
它肯定是有一个适用范围的
那这个时候如果你传给它
一个类型实参
传给它一个
它不能处理的这种类型
那么在处理的时候呢就会出错
所以很多时候
我们在使用泛型的时候呢
要对它的类型参数
做一定的限制
这就是有限制的泛型
我们在这个类型参数type后面呢
可以用extends关键字
加上类名或者接口名
表明我们要求参数所代表的类型
必须是某个类的子类
或者是实现了某个接口的
那大家要注意
我们下一章会讲接口
实现接口呢
一般来说用这个implements关键字
但是对于这个有限制的泛型
我们来描述这个有限制的
泛型类型的时候呢
对于实现了某种接口的
这个有限制泛型
也是使用extends关键字
而不是像通常的这样
去使用implements关键字
这个差别希望大家能够清楚
我们学了接口以后呢
大家可以回过头来
再看看这一条限制
那你就比较清楚了
接下来我们就通过一个例题
来体验一下什么是有限制的泛型
现在看到的这个例子呢
是一个有限制的泛型的例子
这一回在这个类型参数这儿
就有限制了
这个type这个类型
必须是number类的子类
有了这样一项限制
好 那么接下来我们来测试一下
第一次构造
generaltype对象的时候
给它的类型实参是Integer
没有问题
因为Integer确实是number的子类
符合要求 符合这个限制要求
那么(注释掉)的这条语句
也就是我们第二次尝试
用什么呢
用string作为类型实参
如果这条语句不注释掉的话
编译的时候一定会出错
为什么呢
因为不符合限制条件了
这个string不是number的子类
你用string作为类型实参
就不符合语法要求
就会出错
这个是有限制的泛型的
这样一个例子
在这一节呢
我们简单的了解了
有限制的泛型
也就是说我们可以限制
这个类型参数
必须是继承自某个超类
或者是实现了某个接口
这样对这个类型参数
它的范围做了一定的限制以后
我们就便于在程序的方法体中
对特定类家族的
或者特定的实现了某些接口的
这个数据类型
做专门的处理
好 这一节的内容就是这些
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件