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

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

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

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

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

          String file = files.get(0);

          同時當files調(diào)用add方法,編譯器知道有一個類型是String的參數(shù)。這會比使用Object參數(shù)更安全,編譯器可以進行檢查,避免錯誤類型的對象。
          泛型類:具有一個或多個類型變量的類。如下面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;
            }

          }

          當構(gòu)造函數(shù)兩個域不同類型:

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

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

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

          }

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

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

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

             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限制為實現(xiàn)Comparable接口的類,如:

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

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

          <extends Comparable & Serializable>

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

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

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

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

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

                }
          //可以通過

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

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

          }

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

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

           }

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

           

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

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 皋兰县| 那曲县| 巴彦淖尔市| 宜阳县| 巫溪县| 鹤庆县| 喀喇沁旗| 宝兴县| 东兰县| 古丈县| 四会市| 忻城县| 太仓市| 屏东县| 油尖旺区| 新晃| 旺苍县| 永和县| 临澧县| 嘉定区| 孟州市| 民和| 崇明县| 公安县| 隆化县| 陆丰市| 铜梁县| 澜沧| 汽车| 龙海市| 枣阳市| 邛崃市| 大渡口区| 手游| 金秀| 黄平县| 蓬安县| 兴山县| 长岛县| 黄山市| 乌兰察布市|