熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

在Eclipse 3.1體驗J2SE 5.0新特性八(圖)

2013-11-23 20:13:08  來源: Java開源技術 

  
 

  
破壞類型安全引起的錯誤

  
   二義性錯誤
  
  GenMap在聲明是使用了個類型參數T和V 因此在創建GenMap的對象的時候也需要提供個具體的類類型來替代這個類型參數 例如
  
  清單 多個參數的范型類
  
  GenMap gm = new GenMap();
  GenMap gm = new GenMap();
  
  上例中T和V雖然看起來是兩個不同的類型參數但是在使用這個范型類的時候 T和V很有可能被替換成同一種類型因此在聲明多個類型參數的范型類時 要注意避免這種二義性錯誤例如
  
  清單二義性錯誤
  
  public class GenMap {
  //編譯錯誤 二義性錯誤
  public void set(T t){}
  public void set(V v){}
  }
  
  在上面這段代碼如果T和V被替換成同一種類型set函數的簽名(signature)就是完全一樣的 所以編譯器會報告二義性錯誤正確的用法是聲明個不同名的方法 例如
  
  清單 二義性錯誤
  
  public class GenMap {
  public void setKey(T t){}
  public void setValue(V v){}
  }
  
  

  
二義性錯誤

  
   使用通配符
  
  前面我們創建了范型的列表如果我需要一個方法來處理范型列表例如 我們希望把列表中的每個元素都打印出來但是類型參數(type parameter)只能使用在聲明一個范型類的時候如果類型參數使用在函數定義裡會導致編譯錯誤
  
  public static void print(GenList list){} //編譯錯誤
  
  在這種情況下 我們需要用另外一種方法來表示一個范型類 否則 就可能需要書寫多個print函數
  
  public static void print(GenList list){}
  public static void print(GenList list){}
  …
  public static void print(GenList list){}
  
  JSE 中提供了范型的通配符??可以用來代替任何類型 例如使用通配符來實現print方法
  
  public static void print(GenList list) {}
  
   范型的一些局限型
  
  () 類型參數不能實例化 例如
  
  T t= new T();  //編譯錯誤
  
  () 不能實例化類型參數的數組
  
  T[] ts= new T[];  //編譯錯誤
  
  () 類的靜態變量不能聲明為類型參數類型
  
  public class GenClass {
  private static T t;  //編譯錯誤
  }
  
  () 范型類不能繼承自Throwable以及其子類
  
  public GenExpection extends Exception{}  //編譯錯誤
  
  范型小結
  
  范型是JSE 所提供的一項強大的功能 使用范型可以創建類型安全的可重用的代碼 雖然目前Java的范型還無法和C++的范型相提並論 但是 隨著Java語言本事的演進 范型會在Java語言中發揮更大的作用的
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28132.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.