<CoreJava> 12.4类型变量的定义

有时类或方法需要对类型变量加以约束。

  1. class ArrayAlg {  
  2.     public static <T> T min(T[] a) {  
  3.         if (a == null || a.length == 0)  
  4.             return null;  
  5.         T smallest = a[0];  
  6.         for (int i = 1; i < a.length; i++)  
  7.             if (smallest.compareTo(a[i]) > 0)  
  8.                 smallest = a[i];  
  9.         return smallest;  
  10.     }  
  11. }  

问题:min方法内部的变量smallest类型为T,意味着它可以是任意类的对象。那么如何确定T所属的类有compareTo方法呢?

解答:将T限制为实现Comparable接口的类。通过对类型变量T设置限定实现这一点:public static <T extends Comparable> T min(T[] a).......

注意:一个类型变量或通配符可以有多个限定:T extends Comparable & Serializable(限定类型用&分隔,类型变量用,分隔)

例12-2中重新编写了一个泛型方法minmax。方法是计算数组中的最大值和最小值并返回Pair<T>

  1. package core.pair_12_2;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.GregorianCalendar;  
  5.   
  6. /** 
  7.  * @author vincent 
  8.  */  
  9.   
  10. public class PairTest2 {  
  11.   
  12.     public static void main(String[] args) {  
  13.         GregorianCalendar[] birthdays =   
  14.             {  
  15.              new GregorianCalendar(1906, Calendar.DECEMBER, 9),  
  16.              new GregorianCalendar(1815, Calendar.DECEMBER, 10),  
  17.              new GregorianCalendar(1903, Calendar.DECEMBER, 3),  
  18.              new GregorianCalendar(1910, Calendar.JUNE, 22),  
  19.             };  
  20.         Pair<GregorianCalendar> mm = ArrayAlg.minmax(birthdays);  
  21.         System.out.println("min = " + mm.getFirst().getTime());  
  22.         System.out.println("max = " + mm.getSecond().getTime());  
  23.     }  
  24. }  
  25.   
  26. class ArrayAlg {  
  27.   
  28.     @SuppressWarnings({ "rawtypes""unchecked" })  
  29.     public static <T extends Comparable> Pair<T> minmax(T[] a) {  
  30.         if (a == null || a.length == 0return null;  
  31.         T min = a[0];  
  32.         T max = a[0];  
  33.         for (int i = 1; i < a.length; i++) {  
  34.             if (min.compareTo(a[i]) > 0) min = a[i];  
  35.             if (max.compareTo(a[i]) < 0) max = a[i];  
  36.         }  
  37.         return new Pair<T>(min, max);  
  38.     }  
  39. }  
  40.   
  41. class Pair<T> {  
  42.     private T first;  
  43.     private T second;  
  44.   
  45.     public Pair() {  
  46.         first = null;  
  47.         second = null;  
  48.     }  
  49.     public Pair(T first, T second) {  
  50.         this.first = first;  
  51.         this.second = second;  
  52.     }  
  53.       
  54.     public T getFirst() {  
  55.         return first;  
  56.     }  
  57.     public T getSecond() {  
  58.         return second;  
  59.     }  
  60.       
  61.     public void setFirst(T newValue) {  
  62.         first = newValue;  
  63.     }  
  64.     public void setSecond(T newValue) {  
  65.         second = newValue;  
  66.     }  
  67. }  

posted @ 2013-02-28 19:10  vincent_hv  阅读(199)  评论(0编辑  收藏  举报