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> { … }
  • 类定义中的类型变量用于指定方法的返回类型以及域、局部变量的类型。
  • 泛型类的约束与局限性:
  1. 不能用基本类型实例化类型参数
  2. 运行时类型查询只适用于原始类型
  3. 不能抛出也不能捕获泛型类实例
  4. 参数化类型的数组不合法
  5. 不能实例化类型变量
  6. 泛型类的静态上下文中类型变量无效
  7. 注意擦除后的冲突

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:

编辑、调试、运行教材311312页代码,结合程序运行结果理解程序;

在泛型类定义及使用代码处添加注释;

掌握泛型类的定义及使用。 

代码如下:

 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 }
Pair

相关文章:

  • 2022-02-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-16
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案