天天看點

Java — 泛型程式設計(1)(Core Java I)

12.2 定義簡單的泛型類

1)文檔目錄:

Java — 泛型程式設計(1)(Core Java I)

2)代碼:

Pair.java

package com.test1;
//泛型類generic class 就是具有一個或者多個類型變量的類
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 first) {
    this.first = first;
  }
  public void setSecond(T second) {
    this.second = second;
  }
  
  
}      

PairTest1.java

package com.test1;

public class PairTest1 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //String [] words = { "mary","had","a","little","lamb"};
    //大寫字母的字典序排在小寫的後面
    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{
  public static Pair<String> minmax(String[] a){
    if(a == null || a.length == 0) return null;
    String min = a[0];
    String max = a[0];
    //O(n) 複雜度求最大值最小值
    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];
    }
    //這個T可加可不加,因為建立過程中 參數類型已經确認,并且他就是個代号
    return new Pair<String>(min,max);
  }
}      

12.4 類型變量的限定

這裡直接貼 PairTest2.java的代碼

package com.test1;

import java.util.Calendar;
import java.util.GregorianCalendar;
/**
 * 這裡的泛型類依然是Pair
 * 傳入泛型類中的類型變量是GregorianCalendar類
 * 此類已經實作Comparable接口進行日期的比較
 * @author PeersLee
 *
 */
public class PairTest2 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    GregorianCalendar[] birthdays = {
  
        new GregorianCalendar(1900,Calendar.DECEMBER,9),
        new GregorianCalendar(1815,Calendar.DECEMBER,10),
        new GregorianCalendar(1903,Calendar.DECEMBER,3),
        new GregorianCalendar(1910,Calendar.DECEMBER,22),
    };
    Pair<GregorianCalendar> mm = ArrayAlg.minmax(birthdays);
    System.out.println("min: "+mm.getFirst().getTime());
    System.out.println("max: "+mm.getSecond().getTime());
  }

}

class ArrayAlg{
  /**對類型變量進行限制
   * 可以通過對類型變量設定限定實作這 确信T所屬的類一sing有compareTo方法
   * 将T限制限制為實作了Comparable接口(隻含有compareTo的标準接口)
  */
  public static <T extends Comparable> Pair<T> minmax(T[] a){
    //T的綁定類型可以是類,也可以是接口,選擇 extends 的原因是更接近于子類的概念
    //可以有多個綁定 例如 T extends Comparable & Serializable 中間用 ‘&’分格
    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);
    
  }
}      

12.5 泛型代碼和虛拟機

  • 虛拟機中沒有泛型,隻有普通的類和方法。
  • 所有的類型參數都用他們的限定類型替換。
  • 橋方法被合成來保持多态。
  • 為保持類型安全性,必要時插入強制類型轉換