java-泛型程序设计(一)

来源:互联网 发布:淘宝订单交易风险违规 编辑:程序博客网 时间:2024/06/14 15:28

java学习之路-泛型程序设计(一)
参考书籍-java核心技术卷unit8
泛型对于java程序员来说分为几个等级:
1仅仅使用泛型类,jdk设计员已经实现了拿来用就好(可以忽略此文)
2实现自己的泛型类与方法,了解集合中泛型的实现机制。
接下来我们要讨论几个关于泛型的关键点

  1. 怎么自定义一个泛型类
  2. 怎么定义一个泛型方法
  3. 对于类型变量的限定
  4. 虚拟机对于泛型的类型擦除机制

1 定义简单泛型类
一个泛型类就是具有一个或者多个类型变量的类。
具体什么叫 “类型变量“ 表面意思是一个变量可以表示任意类型。具体的见下面描述。
例如下面的例子

public class Pair<T> {   private T first;   private T second;   public Pair() { first = null; second = null; }   public Pair(T first, T second) { this.first = first;  this.second = second; }   public T getFirst() { return first; }   public T getSecond() { return second; }   public void setFirst(T newValue) { first = newValue; }   public void setSecond(T newValue) { second = newValue; }}

T 是类型变量,泛型类还可以有多个类型变量T,U…等等T,U表示不同的类型。

public class Pair<T,U>{..} 

在javase7版本之后,构造函数可以省略泛型类型,编译器可以自动过推断.

  Pair<String> p = new Pair<>("str1","str2");

2 定义泛型方法
定义一个带有类型参数的简单泛型方法
泛型方法意思是这个方法的参数,返回值可以是任意类型。

class ArrayAlg{        public static <T> T getMiddle(T..a)        //<T> 是类型变量,作用是声明这个方法是泛型方法。作用:<T>是用来规范T的,例如<T extends Object>就规定了边界        //T是返回值类型    {        ..    }}

这个方法是在普通类中定义,所以泛型方法可以定义在普通类中也可以定义在泛型类中。 类型变量放在修饰符后面,返回类型前面。
如何调用泛型方法?

//当调用一个泛型方法时候,在方法名前的<>中放入具体的类型String middle = ArrayAlg.<String>getMiddle("str1","str2");//但在实际中,可以省略<>,因为编译器可以根据上下文自动推断出泛型类型。String middle = ArrayAlg.getMiddle("str1","str2");

番外:泛型类中的方法与泛型方法
使用:
泛型类,是在实例化类的时候指明泛型的具体类型;
泛型方法,是在调用方法的时候指明泛型的具体类型。

可能有些人既然已经有了泛型类为什么还要使用泛型方法呢?
因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。


3 类型变量的限定
有时候,类和方法需要对类型变量进行限定。
为什么呢要对类型变量进行限定?
往下面看,举个例子:

//求数组中的最小值class ArrayAlg{    public static <T> min(T[] a){        if(a == null || a.length() == 0)            return null;        T smallest = a[0];        for(int i = 0; i < a.length; i ++){            if(smallest.comapreTo(a[i]) > 0){                smallest = a[i];                }        }        return smallest;        }    }

因为min()方法中的smallest变量调用了compareTo 方法。怎么确保T所属的类有compareTo()方法?所以 泛型T可以是实现了comparable接口的类。 为了保证这个,就需要对类型变量进行限定。

public static <T extends Comparable> T min(T[] a)...

正如上面代码,类型变量的限制必须使用 extends关键字。不能用implements,即使Comparable为接口。 extends表示T是绑定类型的子类型,T与绑定类型可以是类也可以是接口。
限定中可以有多个接口但是最多有一个类(单继承)。extends可以接多个接口超类型,但是至多有一个类,如果extends后面跟有类,这个类必须是第一个。
另外,一个类型变量可以有多个限定。

<T extends Comparable & Serializable>//限定类型用&分割,逗号用来分割类型变量。

类型遍历限定的例子

package pair2;import java.time.*;/** * @version 1.02 2015-06-21 * @author Cay Horstmann */public class PairTest2{   public static void main(String[] args)   {      LocalDate[] birthdays =          {             LocalDate.of(1906, 12, 9), // G. Hopper            LocalDate.of(1815, 12, 10), // A. Lovelace            LocalDate.of(1903, 12, 3), // J. von Neumann            LocalDate.of(1910, 6, 22), // K. Zuse         };      Pair<LocalDate> mm = ArrayAlg.minmax(birthdays);      System.out.println("min = " + mm.getFirst());      System.out.println("max = " + mm.getSecond());   }}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虚拟机中对泛型的处理,以及类型擦除对于泛型的局限行见
java-泛型程序设计(二)

0 0
原创粉丝点击