Java核心技术(五) —— 泛型程序设计(1)

本文主要针对泛型程序设计,从以下方面进行讲解:

  • 为何使用泛型程序设计
  • 定义简单的泛型类
  • 泛型方法
  • 类型变量的限定
  • 泛型代码和虚拟机
  • 约束与局限性
  • 泛型类型的继承规则
  • 通配符类型
  • 反射和泛型

泛型程序设计,意味着编写的代码可以被很多不同类型的对象所重用。

1、泛型类

一个泛型类就是具有一个或多个类型变量的类,如定义一个Pair类
这里写图片描述
其中,Pair类引入了一个类型变量T,一般用比较短的大写形式来书写。实际上泛型类可以有多个类型变量,如上述程序中可以定义第一个域和第二个域具有不同的类型
这里写图片描述
之后,只要用具体的类型替换类型变量就可以实例化泛型类型了。

好,下面用一个综合的例子来说明

package pair1;

public class PairTest1
{
   public static void main(String[] args)
   {
      String[] words = { "Mary", "had", "a", "little", "lamb" };
      Pair<String> mm = ArrayAlg.minmax(words);
      System.out.println("min = " + mm.getFirst());
      System.out.println("max = " + mm.getSecond());
   }
}

class ArrayAlg
{
   /**
    * Gets the minimum and maximum of an array of strings.
    * @param a an array of strings
    * @return a pair with the min and max value, or null if a is null or empty
    */
   public static Pair<String> minmax(String[] a)
   {
      if (a == null || a.length == 0) return null;
      String min = a[0];
      String max = a[0];
      for (int i = 1; i < a.length; i++)
      {
         if (min.compareTo(a[i]) > 0) min = a[i];
         if (max.compareTo(a[i]) < 0) max = a[i];
      }
      return new Pair<>(min, max);
   }
}

2、泛型方法

前面介绍了定义简单的泛型类,实际上,还可以定义一个带有类型参数的简单方法,例
这里写图片描述
注意,类型变量<T>放在修饰符(这里是public static)后面,返回类型(这里是T)的前面。

(1)泛型方法可以定义在普通类中,也可以定义在泛型类中。
(2)当调用泛型方法时,在方法名前的<>中放入具体的类型即可
这里写图片描述
实际上,大多数情况下编译器有足够的信息能够推断出所调用的方法,即绝大多数情况下可以直接调用
这里写图片描述

3、类型变量的限定

有时需要对类型变量T设置限定,<T extends BoundingType>,表示T应该是绑定类型BoundingType的子类型,T和绑定类型BoundingType可以是类,也可以是接口。
如下例是将T限制为实现了Comparable接口的类,
这里写图片描述
而且一个类型变量或者通配符可以有多个限定,限定类型用&分隔,类型变量用逗号来分隔。
下面,我们用段程序来复习下

package pair2;
import java.util.*;
public class PairTest2
{
   public static void main(String[] args)
   {
      GregorianCalendar[] birthdays = 
         { 
            new GregorianCalendar(1906, Calendar.DECEMBER, 9), // G. Hopper
            new GregorianCalendar(1815, Calendar.DECEMBER, 10), // A. Lovelace
            new GregorianCalendar(1903, Calendar.DECEMBER, 3), // J. von Neumann
            new GregorianCalendar(1910, Calendar.JUNE, 22), // K. Zuse
         };
      Pair<GregorianCalendar> mm = ArrayAlg.minmax(birthdays);
      System.out.println("min = " + mm.getFirst().getTime());
      System.out.println("max = " + mm.getSecond().getTime());
   }
}

class ArrayAlg
{
   /**
      Gets the minimum and maximum of an array of objects of type T.
      @param a an array of objects of type T
      @return a pair with the min and max value, or null if a is 
      null or empty
   */
   public static <T extends Comparable> Pair<T> minmax(T[] a) 
   {
      if (a == null || a.length == 0) return null;
      T min = a[0];
      T max = a[0];
      for (int i = 1; i < a.length; i++)
      {
         if (min.compareTo(a[i]) > 0) min = a[i];
         if (max.compareTo(a[i]) < 0) max = a[i];
      }
      return new Pair<>(min, max);
   }
}
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值