<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    有才華的人,別忘記給滋潤你的那塊土壤施肥

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      28 隨筆 :: 5 文章 :: 147 評論 :: 0 Trackbacks

    因為公司的程序要兼容到JDK1.3,所以對泛型沒有系統的去了解下。以下是在核心技術那本書上的摘抄:
    使用泛型機制編寫的程序代碼要比那些雜亂地使用Object變量,然后再進行強制類型轉換的代碼具有更好的安全性和可讀性。如:

    ArrayList<Sting> files = new ArrayList<String>();

    一看就知道這個數組列表中包含的是String對象。同時編譯器據此不需要強制類型轉換,返回類型為String,而不是Object:

    String file = files.get(0);

    同時當files調用add方法,編譯器知道有一個類型是String的參數。這會比使用Object參數更安全,編譯器可以進行檢查,避免錯誤類型的對象。
    泛型類:具有一個或多個類型變量的類。如下面Pair類的代碼:

    public class Pair<T>{
      
    private T first;
      
    private T second;
      
    public Pair(){
       
    this.first = null;
       
    this.second = null;
      }

      
    public Pair(T first, T second){
       
    this.first = first;
       
    this.second = second;
      }

      
    public T getFirst() {
       
    return first;
      }

      
    public void setFirst(T first) {
       
    this.first = first;
      }

      
    public T getSecond() {
       
    return second;
      }

      
    public void setSecond(T second) {
       
    this.second = second;
      }

    }

    當構造函數兩個域不同類型:

    Public class Pair<T,U>{……}

    補充:類型變量使用大寫形式,且較短,如使用E表示集合的元素類型,K和V表示表的關鍵字與值的類型,T表示任意類型。
    泛型方法:定義一個帶有類型參數的簡單方法。

    class GenericTest{
     
    public static<T> T getMiddle(T[] a){
      
    return a[a.length/2];
     }

    }

    泛型方法可以在普通的類中,也可以在泛型類中。當調用一個泛型方法時,
    方法名前的尖括號中放入具體的類型:

    String[] names = {"a","b","c"};
    String  middle 
    = GenericTest.<String>getMiddle(names);

    但是在大多數情況下,方法調用中可以省略<String>類型參數。
    類型變量的限定:
    如下代碼,我們要計算數組中最小元素:

       static class GenericTest{
      
    public static<T> T getMin(T[] a){
       
    if(a == null || a.length  == 0){
        
    return null;
       }

       T smallest 
    = a[0];
       
    for(int i=1; i<a.length;i++){
        
    if(smallest.compareTo(a[i]) >0 )
         smallest 
    = a[i];
       }

       
    return smallest;
      }

     }

    如此如何知道T所屬的類有compareTo方法呢?,可以將T限制為實現Comparable接口的類,如:

    public static<extends Comparable> T getMin(T[] a){。。。}

    應此沒有實現Comparable接口,調用getMin將會產生一個編譯錯誤。
    一個類型變量或通配符可以有多個限定,如:

    <extends Comparable & Serializable>

    泛型代碼和虛擬機
    1. 虛擬機中沒有泛型,只有普通的類和方法;
    2. 所有的類型參數都用他們的邊界替換;
    3. 橋方法被合成為保持多態的;
    4. 為保持類型的安全性,必要時插入強制類型轉換。

    約束與局限性
    1、 基本類型:不能用類型參數替換基本類型。因此沒有Pair<double>,只有Pair<Double>,原因是類型擦除之后Pair類具有Object類型的域,而Object不能存儲double值。
    2、 運行時類型查詢:虛擬機中的對象總有一個特定的非泛型類型,所以所有的類型查詢只產生原始類型。所以無論何時使用instanceof或設計類型的強制類型轉換表達式都會看到一個編譯警告。同樣getClass方法總是返回原始類型。
    3、 異常:不能拋出也不能捕獲泛型類的對象泛型無法擴展Throwable都不合法。如:

    public class Problem<T> extends Exception{…..}//錯誤,

    不能在catch子句中使用類型變量。但是在異常聲明中可以使用類型變量。如:

          public<extends Throwable> void test(Class<T> a){
               
    try{  
               }
    catch(Throwable e){  
              }

          }
    //可以通過

    4、 數組:不能聲明參數化類型的數組
    5、 泛型類型的實例化:不能實例化泛型,如下面就是錯誤的:

    public class Pair<T>{
     
    public Pair(){
      
    this.first = new T();
      
    this.second = new T();
      }

    }

    6、不能在靜態域或方法中引用類型變量。如下面的高招將無法實施:

    public class Singleton<T>{
              
    private static T singleInstance;//錯誤
              public static T getSingleInstance(){//錯誤
          if(singleInstance != null)
        
    return singleInstance;
              }

     }

    7、擦除后的沖突:要支持擦除的轉換,需要強行限制一個類或類型變量不能同時成為兩個接口類型的子類,而這個接口是同一接口的不同參數化。

     

    posted on 2008-04-10 16:24 kissjava 閱讀(720) 評論(0)  編輯  收藏 所屬分類: java基礎

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 99久久免费国产精品热| 四虎国产成人永久精品免费| 久久亚洲中文字幕精品一区四| 免费看成人AA片无码视频吃奶| 无码少妇精品一区二区免费动态| 亚洲日本视频在线观看| 免费无码中文字幕A级毛片| 97久久国产亚洲精品超碰热| 亚洲天堂中文字幕在线| 免费女人高潮流视频在线观看| 亚洲影院天堂中文av色| 国产亚洲成AV人片在线观黄桃| 国产三级在线观看免费| 在线看片免费人成视频福利| 亚洲色www永久网站| 亚洲人成人网站色www| 成在人线AV无码免费| 特级做A爰片毛片免费看无码| 亚洲狠狠成人综合网| 亚洲日韩精品无码专区网址| 在线播放免费播放av片| 久久久久久久99精品免费观看| 亚洲欧洲精品成人久久曰| 久久久综合亚洲色一区二区三区| 永久免费av无码网站大全| 久久精品无码专区免费青青| 乱爱性全过程免费视频| 亚洲高清无码专区视频| 成年黄网站色大免费全看| 久久最新免费视频| 亚洲a无码综合a国产av中文| 精品日韩亚洲AV无码| 亚洲综合色自拍一区| 四虎永久精品免费观看| 美女18一级毛片免费看| 亚洲一区二区三区久久久久| 亚洲bt加勒比一区二区| 国产亚洲人成无码网在线观看 | 久久精品电影免费动漫| 人人鲁免费播放视频人人香蕉| MM1313亚洲精品无码久久|