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

            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 閱讀(721) 評論(0)  編輯  收藏 所屬分類: java基礎

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


          網站導航:
           
          主站蜘蛛池模板: 泽库县| 错那县| 淄博市| 天祝| 来宾市| 东光县| 台南县| 东乌珠穆沁旗| 琼海市| 揭阳市| 商南县| 阳江市| 嘉善县| 白河县| 会理县| 萍乡市| 莎车县| 横峰县| 鹰潭市| 周至县| 南丰县| 弥渡县| 奉新县| 新兴县| 镇宁| 黑山县| 巩义市| 衡水市| 突泉县| 茌平县| 伊川县| 义马市| 江川县| 通渭县| 尼木县| 安岳县| 高唐县| 茶陵县| 老河口市| 湖北省| 长泰县|