201871010111-刘佳华《面向对象程序设计(java)》第十一周学习总结
实验九 泛型程序设计技术
实验时间 2019-11-8
1、实验目的与要求
(1) 理解泛型概念;
(2) 掌握泛型类的定义与使用;
(3) 了解泛型方法的声明与使用;
(4) 掌握泛型接口的定义与实现;
(5) 理解泛型程序设计,理解其用途
第一部分:理论知识总结
1、泛型程序设计概念
- JDK 5.0 中增加的泛型类型,是Java 语言中类型安全的一次重要改进。
- 泛型:也称参数化类型(parameterized type),就是在定义类、接口和方法时,通过类型参数指示将要处理的对象类型。(如ArrayList类)
- 泛型程序设计(Generic programming):编写代码可以被很多不同类型的对象所重用。
2、泛型类的声明及实例化的方法
- 一个泛型类(generic class)就是具有一个或多个类型变量的类,即创建用类型作为参数的类。
- 如一个泛型类定义格式如下:class Generics<K,V>其中的K和V是类中的可变类型参数。
- Pair类引入了一个类型变量T,用尖括号(<>)括起来,并放在类名的后面。
- 泛型类可以有多个类型变量。例如:public class Pair<T, U> { … }
- 类定义中的类型变量用于指定方法的返回类型以及域、局部变量的类型。
- 泛型类的约束与局限性:
- 不能用基本类型实例化类型参数
- 运行时类型查询只适用于原始类型
- 不能抛出也不能捕获泛型类实例
- 参数化类型的数组不合法
- 不能实例化类型变量
- 泛型类的静态上下文中类型变量无效
- 注意擦除后的冲突
3、泛型方法的定义
- 泛型方法:除了泛型类外,还可以只单独定义一个方法作为泛型方法,用于指定方法参数或者返回值为泛型类型,留待方法调用时确定。
- 泛型方法可以声明在泛型类中,也可以声明在普通类中。
public class ArrayTool { public static<T> void insert(T[] e, int p) { //请自己添加代码 } public static<T> T valueAt(T[] e , int p) { //请自己添加代码 } }
4、泛型接口的定义
public interfance IPool<T> { T get(); int add(T t); }
泛型变量的限定:
1.定义泛型变量的上界
extends关键字所声明的上界既可以是一个类,也可以是一个接口
2.定义泛型变量的下界
– 通过使用super关键字可以固定泛型参数的类型为某种类型或者其超类
– 当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符
泛型类的约束与局限性(*)
不能用基本类型实例化类型参数
运行时类型查询只适用于原始类型
不能抛出也不能捕获泛型类实例
参数化类型的数组不合法
不能实例化类型变量
泛型类的静态上下文中类型变量无效注意擦除后的
泛型类型的继承规则(*)
Java中的数组是协变的(covariant)。
通配符类型
通配符
– “?”符号表明参数的类型可以是任何一种类型,它和参数T的含义是有区别的。T表示一种未知类型,而“?”表示任何一种类型。这种通配符一般有以下三种用法:
– 单独的?,用于表示任何类型。
– ? extends type,表示带有上界。
– ? super type,表示带有下界。
第二部分:实验内容和步骤
实验1: 导入第8章示例程序,测试程序并进行代码注释。
测试程序1:
l 编辑、调试、运行教材311、312页代码,结合程序运行结果理解程序;
l 在泛型类定义及使用代码处添加注释;
l 掌握泛型类的定义及使用。
代码如下:
1 package pair1; 2 3 /** 4 * @version 1.00 2004-05-10 5 * @author Cay Horstmann 6 */ 7 public class Pair<T> //用户自定义泛型pair类 8 { 9 private T first; 10 private T second; 11 12 public Pair() { first = null; second = null; } 13 public Pair(T first, T second) { this.first = first; this.second = second; } 14 15 public T getFirst() { return first; } 16 public T getSecond() { return second; } 17 18 public void setFirst(T newValue) { first = newValue; } 19 public void setSecond(T newValue) { second = newValue; } 20 }