国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Eclipse3.1中體驗(yàn)J2SE5.0之泛型(組圖)

2019-11-18 13:01:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友


  泛型(Generics)簡(jiǎn)介
  
  J2SE 5.0中的最顯著的變化之一是添加對(duì)泛型類(lèi)型的支持. 在J2SE 1.4 以及之前的版本中, java程序并不是類(lèi)型安全的. 例如, Collection framework中定義的List, Map等容器類(lèi)的元素都是Object類(lèi)型, 即這個(gè)類(lèi)包含的元素是Object對(duì)象. 使用這種方式實(shí)現(xiàn)的列表, 可以用來(lái)操作整數(shù), 實(shí)數(shù), 字符串或者任何對(duì)象類(lèi)型. 例如
  
  清單1.1 類(lèi)型不安全的代碼示例
  
  List stringList = new ArrayList();
  stringList.add("abcde");
  String str = (String)stringList.get(0);
  
  這種方法實(shí)現(xiàn)的列表需要使用強(qiáng)制類(lèi)型轉(zhuǎn)換(又稱(chēng)顯示造型), 因此不是類(lèi)型安全的. 在上面這段代碼種, 雖然變量名為stringList, 但是我們?nèi)匀豢梢园岩粋€(gè)整型對(duì)象添加到這個(gè)隊(duì)列中, 例如,
  
  清單1.2 類(lèi)型不安全的代碼示例
  
  stringList.add(new Integer(5));
  
  在這種情況下, 從字符列表中獲取對(duì)象時(shí), 強(qiáng)制類(lèi)型轉(zhuǎn)換就會(huì)導(dǎo)致運(yùn)行時(shí)異常.
  
  清單1.3 類(lèi)型不安全的代碼示例
  
  String str = (String)stringList.get(1); //runtime exception
  
  泛型是Java邁向類(lèi)型安全的一個(gè)重要步驟, 使用泛型可以構(gòu)造出類(lèi)型安全的代碼.
  
  聲明泛型
  
  所謂泛型是指類(lèi)型參數(shù)化(parameterized types). Java是一種強(qiáng)類(lèi)型的語(yǔ)言, 在J2SE 1.4以及以前的版本中, 我們?cè)诙x一個(gè)Java類(lèi), 接口或者方法的時(shí)候, 必須指定變量的類(lèi)型. 在聲明泛型類(lèi)、接口或者函數(shù)時(shí), 定義變量的時(shí)候不指定某些變量的具體類(lèi)型, 而是用一個(gè)類(lèi)型參數(shù)代替. 在使用這個(gè)類(lèi), 接口, 或者方法的時(shí)候, 這個(gè)類(lèi)型參數(shù)由一個(gè)具體類(lèi)型所代替.
  
  2.1 泛型類(lèi)
  
  下面的例子中介紹了如何創(chuàng)建一個(gè)最簡(jiǎn)單泛型類(lèi)
  
  清單2.1, 最簡(jiǎn)單的泛型類(lèi)
  
  public class GenSample<T> {}
  
  類(lèi)名后面帶有<T>表明了這個(gè)類(lèi)是泛型類(lèi), 其中T被成為類(lèi)型參數(shù)(type parameter), 在使用泛型的時(shí)候, 類(lèi)型參數(shù)可以被替換為任何的類(lèi)類(lèi)型, 但是不能是原始類(lèi)型(PRimitive type), 例如int, double.
  
  下面通過(guò)一個(gè)列表的例子來(lái)具體說(shuō)明假如聲明泛型類(lèi)和類(lèi)型參數(shù)的用法.
  
  清單2.2, 泛型列表
  
  public class GenList <T>{
  private T[] elements;
  private int size = 0;
  private int length = 0;
  
  public GenList(int size) {
  elements = (T[])new Object[size];
  this.size = size;
  }
  
  public T get(int i) {
  if (i < length) {
  return elements[i];
  }
  return null;
  }
  
  public void add(T e) {
  if (length < size - 1)
  elements[length++] = e;
  }
  }
  
  在列表的例子中, 類(lèi)型參數(shù)T被用來(lái)表示列表中的元素的類(lèi)型, 即, 這個(gè)列表中的元素是T類(lèi)型的.
  
  在使用這個(gè)列表時(shí), 這個(gè)類(lèi)型參數(shù)T會(huì)被具體的類(lèi)型所替代.
  
  注重, 由于T時(shí)類(lèi)型參數(shù)不是具體的類(lèi), 所以不能使用new操作符創(chuàng)建T的對(duì)象,例如new T(), 或者, new T[10].
  
  2.2 泛型接口
  
  在J2SE 5.0中, 不僅僅可以聲明泛型類(lèi), 也可以聲明泛型接口, 聲明泛型接口和聲明泛型類(lèi)的語(yǔ)法類(lèi)似, 也是在接口命稱(chēng)后面加上<T>. 例如,
  
  清單3.2.3, 泛型接口
  
  public interface GenInterface<T> {
  void func(T t);
  }
  
  2.3、聲明多個(gè)類(lèi)型參數(shù)的泛型類(lèi)或者接口
  
  在聲明泛型類(lèi)的時(shí)候, 可是使用多個(gè)類(lèi)型參數(shù). 多個(gè)類(lèi)型參數(shù)之間用逗號(hào)分開(kāi), 例如,
  
  清單3.2.4, 多個(gè)類(lèi)型參數(shù)的泛型類(lèi)
  
  public class GenMap<T, V> {}
  
  Eclipse 3.1的類(lèi)創(chuàng)建向?qū)еС謩?chuàng)建泛型類(lèi), 如下圖所示,
  
  圖2.1 使用類(lèi)向?qū)?chuàng)建泛型類(lèi)
  
 Eclipse3.1中體驗(yàn)J2SE5.0之泛型(組圖)(圖一)

  使用Eclipse接口向?qū)?chuàng)建泛型接口
  
  圖2.2 使用接口向?qū)?chuàng)建泛型接口
  
 Eclipse3.1中體驗(yàn)J2SE5.0之泛型(組圖)(圖二)

  2.4 泛型方法
  
  類(lèi)型參數(shù)(type parameter)不僅僅可以用來(lái)聲明泛型類(lèi)或者泛型接口, 也可以用來(lái)聲明泛型方法, 而且這種聲明的泛型方法可以用在非泛型類(lèi)中, 聲明泛型方法的一般格式是
  
  清單2.5 泛型方法的一般形式
  
  <type-list> return-type method-name(parameter-list) {}
  
  清單3.2.6 泛型方法示例
  
  public <T> String getString(T obj) {
  return obj.toString();
  }
  
  2.5 受限泛型
  
  受限泛型是指類(lèi)型參數(shù)的取值范圍是受到限制的. extends要害字不僅僅可以用來(lái)聲明類(lèi)的繼續(xù)關(guān)系, 也可以用來(lái)聲明類(lèi)型參數(shù)(type parameter)的受限關(guān)系.例如, 我們只需要一個(gè)存放數(shù)字的列表, 包括整數(shù)(Long, Integer, Short), 實(shí)數(shù)(Double, Float), 不能用來(lái)存放其他類(lèi)型, 例如字符串(String), 也就是說(shuō), 要把類(lèi)型參數(shù)T的取值泛型限制在Number極其子類(lèi)中.在這種情況下, 我們就可以使用extends要害字把類(lèi)型參數(shù)(type parameter)限制為數(shù)字,
  
  清單2.7 受限泛型示例
  public class Limited<T extends Number> {
  public static void main(String[] args) {
  Limited<Integer> number;  //正確
  Limited<String> str;    //編譯錯(cuò)誤
  }
  }
  
  在Eclipse 3.1中, 上例中的編譯錯(cuò)誤信息如下圖所示
  
  圖2.3 由于受限泛型導(dǎo)致的編譯錯(cuò)誤
  
 Eclipse3.1中體驗(yàn)J2SE5.0之泛型(組圖)(圖三)

  在程序中使用泛型
  
  3.1在程序中使用泛型類(lèi)
  
  在創(chuàng)建泛型類(lèi)的對(duì)象的時(shí)候, 和創(chuàng)建普通對(duì)象基本類(lèi)似, 必須提供具體的類(lèi)類(lèi)型來(lái)替代類(lèi)型參數(shù)T (J2SE 5.0目前不支持原始類(lèi)型作為類(lèi)型參數(shù)(type parameter)).
  
  清單3.1, 使用泛型類(lèi)
  
  //假如需要整型的列表
  GenList<Integer> integerList = new GenList<Integer>();
  //假如需要字符型的列表
  GenList<String> strList = new GenList<String>();
  //不能使用原始類(lèi)型
  GenList<int> nList = new GenList<int>(); //編譯錯(cuò)誤
  
  3.2 使用泛型解決類(lèi)型安全性問(wèn)題
  
  使用泛型實(shí)現(xiàn)的列表是類(lèi)型安全的, 下列破壞類(lèi)型安全語(yǔ)句會(huì)在編譯的時(shí)候檢查出來(lái)。 把鼠標(biāo)放在錯(cuò)誤標(biāo)記上, Eclipse 3.1中的錯(cuò)誤提示就會(huì)顯示,如下圖所示:
  
  圖3.3.2 破壞類(lèi)型安全引起的錯(cuò)誤
  
 Eclipse3.1中體驗(yàn)J2SE5.0之泛型(組圖)(圖四)

  3.3 二義性錯(cuò)誤
  
  GenMap在聲明是使用了2個(gè)類(lèi)型參數(shù)T和V, 因此在創(chuàng)建GenMap的對(duì)象的時(shí)候也需要提供2個(gè)具體的類(lèi)類(lèi)型來(lái)替代這2個(gè)類(lèi)型參數(shù), 例如,
  
  清單9, 多個(gè)參數(shù)的泛型類(lèi)
  
  GenMap<Integer, String> gm = new GenMap<Integer, String>();
  GenMap<String, String> gm2 = new GenMap<String, String>();
  
  上例中, T和V雖然看起來(lái)是兩個(gè)不同的類(lèi)型參數(shù), 但是在使用這個(gè)泛型類(lèi)的時(shí)候, T和V很有可能被替換成同一種類(lèi)型. 因此在聲明多個(gè)類(lèi)型參數(shù)的泛型類(lèi)時(shí), 要注重避免這種二義性錯(cuò)誤, 例如,
  
  清單10, 二義性錯(cuò)誤
  
  public class GenMap<T, V> {
  //編譯錯(cuò)誤, 二義性錯(cuò)誤
  public void set(T t){}
  public void set(V v){}
  }
  
  在上面這段代碼, 假如T和V被替換成同一種類(lèi)型, set函數(shù)的簽名(signature)就是完全一樣的, 所以編譯器會(huì)報(bào)告二義性錯(cuò)誤. 正確的用法是聲明2個(gè)不同名的方法, 例如,
  
  清單10, 二義性錯(cuò)誤
  
  public class GenMap<T, V> {
  public void setKey(T t){}
  public void setValue(V v){}
  }
  
  圖3.3 二義性錯(cuò)誤
  
Eclipse3.1中體驗(yàn)J2SE5.0之泛型(組圖)(圖五)

  3.4 使用通配符
  
  前面我們創(chuàng)建了泛型的列表, 假如我需要一個(gè)方法來(lái)處理泛型列表, 例如, 我們希望把列表中的每個(gè)元素都打印出來(lái), 但是類(lèi)型參數(shù)(type parameter)只能使用在聲明一個(gè)泛型類(lèi)的時(shí)候, 假如類(lèi)型參數(shù)使用在函數(shù)定義里會(huì)導(dǎo)致編譯錯(cuò)誤。
  
  public static void print(GenList<T> list){} //編譯錯(cuò)誤
  
  在這種情況下, 我們需要用另外一種方法來(lái)表示一個(gè)泛型類(lèi), 否則, 就可能需要書(shū)寫(xiě)多個(gè)print函數(shù)。
  
  public static void print(GenList<Integer> list){}
  public static void print(GenList<Double> list){}
  …
  public static void print(GenList<String> list){}
  
  J2SE 5.0中提供了泛型的通配符"?", "?"可以用來(lái)代替任何類(lèi)型, 例如使用通配符來(lái)實(shí)現(xiàn)print方法。
  
  public static void print(GenList<?> list) {}
  
  泛型的一些局限型
  
  (1) 類(lèi)型參數(shù)不能實(shí)例化, 例如,
  
  T t= new T();  //編譯錯(cuò)誤
  
  (2) 不能實(shí)例化類(lèi)型參數(shù)的數(shù)組
  
  T[] ts= new T[10];  //編譯錯(cuò)誤
  
  (3) 類(lèi)的靜態(tài)變量不能聲明為類(lèi)型參數(shù)類(lèi)型
  
  public

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇沅| 邹平县| 莱阳市| 阜阳市| 肥东县| 旬阳县| 光山县| 汉源县| 法库县| 威远县| 沿河| 阿克苏市| 康平县| 塔城市| 海城市| 丹寨县| 浑源县| 财经| 永登县| 保靖县| 伊川县| 迁西县| 襄汾县| 荣昌县| 乌拉特后旗| 崇礼县| 新丰县| 准格尔旗| 济宁市| 汕尾市| 新乡市| 镇康县| 环江| 堆龙德庆县| 沾化县| 长武县| 商都县| 纳雍县| 大同市| 宿松县| 鹤壁市|