码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-12 17:53:49      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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);
   }
}

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

标签:

原文地址:http://blog.csdn.net/lipengcn/article/details/51351146

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!