当前课程知识点:Java程序设计 >  第三章 类的重用 >  3.5-泛型 >  3.5-泛型

返回《Java程序设计》慕课在线视频课程列表

3.5-泛型在线视频

3.5-泛型

下一节:3.6-类的组合

返回《Java程序设计》慕课在线视频列表

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作为类型实参

就不符合语法要求

就会出错

这个是有限制的泛型的

这样一个例子

在这一节呢

我们简单的了解了

有限制的泛型

也就是说我们可以限制

这个类型参数

必须是继承自某个超类

或者是实现了某个接口

这样对这个类型参数

它的范围做了一定的限制以后

我们就便于在程序的方法体中

对特定类家族的

或者特定的实现了某些接口的

这个数据类型

做专门的处理

好 这一节的内容就是这些

Java程序设计课程列表:

第一章 Java语言基础知识

-1.0-导学

--1.0-导学

--JDK的安装与配置01

--JDK的安装与配置02

--JDK的安装与配置03

--编辑并执行第一个java程序01

--编辑并执行第一个java程序02

--编辑并执行第一个java程序03

--eclipse的安装和配置01

--eclipse的安装和配置02

--eclipse的安装和配置03

--使用eclipse进行Java的开发01

--使用eclipse进行Java的开发02

--使用eclipse进行Java的开发03

-1.1-Java与面向对象程序设计简介

--1.1.1 Java与面向对象程序设计简介

--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介

-1.2-基本数据类型与表达式

--1.2.1-基本数据类型与表达式

-第一章 Java语言基础知识--1.2-基本数据类型与表达式

-1.3-数组

--1.3.1-数组

-第一章 Java语言基础知识--1.3-数组

-1.4-算法的流程控制

--1.4.1-算法的流程控制

--第一章 Java语言基础知识--1.4-算法的流程控制

-1.5-第一章小结

--1.5.1-第一章小结

-第一章编程练习题

-课件

--外部链接

第一章续-习题讲解视频

-Java环境配置、Eclipse使用、Helloworld程序详解

--JAVA的安装和配置

--编写并执行第一个Java程序及Java的跨平台性

--eclipse的安装和配置

--使用eclipse建立Java项目、编写和运行Java程序

--Java注释和Eclipse中的注释操作

--详解HelloWorld程序

-Java数据类型

--Java数据类型介绍

--Java整数类型

--Java浮点类型

--Java字符类型和布尔类型

--数据类型实战

--数据类型转换

--Java强制类型转换精度损失示例与表达式中的数据类型转换

-Java数组

--Java数组介绍、声明与使用

--一维数组的初始化与length属性

--数组索引的原理与使用

--二维数组的介绍与使用

-Java变量

--Java的变量

-命令行参数

--命令行参数的介绍

第二章 类与对象

-2.0-导学

--2.0-导学

-2.1-面向对象方法的特性

--2.1-面向对象方法的特性

--第二章 类与对象--2.1-面向对象方法的特性

-2.2-1-类声明与对象创建

--2.2-1-类声明与对象创建

--第二章 类与对象--2.2-1-类声明与对象创建

-2.2-2-数据成员

--2.2-2-数据成员

--第二章 类与对象--2.2-2-数据成员

-2.2-3-方法成员

--2.2-3-方法成员

--第二章 类与对象--2.2-3-方法成员

-2.2-4-包

--2.2-4-包

--第二章 类与对象--2.2-4-包

-2.2-5-类的访问权限控制

--2.2-5-类的访问权限控制

--第二章 类与对象--2.2-5-类的访问权限控制

-2.3-1-对象初始化

--2.3-1-对象初始化

--第二章 类与对象--2.3-1-对象初始化

-2.3-2-内存回收

--2.3-2-内存回收

--第二章 类与对象--2.3-2-内存回收

-2.4-枚举类

--2.4-枚举类

--第二章 类与对象--2.4-枚举类

-2.5-应用举例

--2.5-应用举例

-2.6-第2章小结

--2.6-第2章小结

-第二章编程练习题

-课件

--第二章课件

第三章 类的重用

-3.0-导学

--3.0-导学

-3.1.1-3.1.2-类继承的概念和语法

--3.1.1-3.1.2-类继承的概念和语法

--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法

-3.1.3-隐藏和覆盖

--3.1.3-隐藏和覆盖

--第三章 类的重用--3.1.3-隐藏和覆盖

-3.2-Object 类

--3.2-Object 类

--第三章 类的重用--3.2-Object 类

-3.3-终结类与终结方法

--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.1-5.1.2-异常处理的概念

-5.1.3-5.1.5-异常的处理

--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集合框架介绍

--Java集合框架介绍

--第六章 对象群体的组织--6.1-Java集合框架介绍

-6.2-主要接口及常用的实现类

--6.2-主要接口及常用的实现类

--第六章 对象群体的组织--6.2-主要接口及常用的实现类

-6.3-常用算法

--常用算法

-6.4-数组实用方法

--6.4-数组实用方法

-6.5-基于动态数组的类型(Vector, ArrayList)

--基于动态数组的类型(Vector, ArrayList)

-6.6-遍历Collection

--遍历Collection

-6.7-Map接口及其实现

--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.9-中间层容器(一)

-7.10-中间层容器(二)

--7.10-中间层容器(二)

-7.11-原子组件(一)

--7.11-原子组件(一)

-7.12-原子组件(二)

--7.12-原子组件(二)

-7.13-原子组件(三)

--7.13-原子组件(三)

-7.14-其它Swing特性

--7.14-其它Swing特性

-7.15-第7章小结

--7.15-第7章小结

-课件

--课件

3.5-泛型笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。