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

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


    網站導航:
     
    主站蜘蛛池模板: av免费不卡国产观看| 在线观看av永久免费| 免费视频成人手机在线观看网址| 99在线在线视频免费视频观看 | 免费人成再在线观看网站| 国产黄色片免费看| 国产免费看JIZZ视频| 亚洲免费中文字幕| 中文字幕免费在线看电影大全| 99在线精品免费视频九九视| 亚洲高清美女一区二区三区| free哆拍拍免费永久视频| 久久久无码精品亚洲日韩软件| 亚洲国产成人精品久久| 成年女人色毛片免费看| 亚洲影院在线观看| 久久久久久国产a免费观看不卡| 97在线观看永久免费视频| 亚洲成人网在线播放| 久久这里只精品99re免费| 在线精品亚洲一区二区小说| 理论亚洲区美一区二区三区 | 毛片免费观看的视频| 精品国产日韩亚洲一区在线| 国产亚洲精品久久久久秋霞| 久久久久国色av免费看| 亚洲国产精品碰碰| 亚洲精品无码久久| 免费无码AV电影在线观看| 亚洲黄色在线播放| 精品国产一区二区三区免费看| 2022年亚洲午夜一区二区福利 | 91免费在线播放| 亚洲AV无码国产在丝袜线观看| 农村寡妇一级毛片免费看视频| 亚洲理论电影在线观看| a色毛片免费视频| 亚洲精品无码不卡在线播HE | 一级特黄录像免费播放中文版| 国产小视频免费观看| 亚洲丶国产丶欧美一区二区三区|