欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Eclipse3.1中體驗J2SE5.0之泛型

系統(tǒng) 1864 0

泛型(Generics)簡介

  J2SE 5.0中的最顯著的變化之一是添加對泛型類型的支持. 在J2SE 1.4 以及之前的版本中, Java程序并不是類型安全的. 例如, Collection framework中定義的List, Map等容器類的元素都是Object類型, 即這個類包含的元素是Object對象. 使用這種方式實現(xiàn)的列表, 可以用來操作整數(shù), 實數(shù), 字符串或者任何對象類型. 例如

清單1.1 類型不安全的代碼示例

            
              
List stringList = new ArrayList();
stringList.add("abcde");
String str = (String)stringList.get(0);

            
          

  這種方法實現(xiàn)的列表需要使用強制類型轉(zhuǎn)換(又稱顯示造型), 因此不是類型安全的. 在上面這段代碼種, 雖然變量名為stringList, 但是我們?nèi)匀豢梢园岩粋€整型對象添加到這個隊列中, 例如,

清單1.2 類型不安全的代碼示例

            
              
stringList.add(new Integer(5));

            
          

  在這種情況下, 從字符列表中獲取對象時, 強制類型轉(zhuǎn)換就會導(dǎo)致運行時 異常 .

清單1.3 類型不安全的代碼示例

            
              
String str = (String)stringList.get(1); //runtime exception

            
          

  泛型是Java邁向類型安全的一個重要步驟, 使用泛型可以 構(gòu)造 出類型安全的代碼.

聲明泛型

  所謂泛型是指類型參數(shù)化(parameterized types). Java是一種強類型的語言, 在J2SE 1.4以及以前的版本中, 我們在定義一個Java類, 接口或者方法的時候, 必須指定變量的類型. 在聲明泛型類、接口或者函數(shù)時, 定義變量的時候不指定某些變量的具體類型, 而是用一個類型參數(shù)代替. 在使用這個類, 接口, 或者方法的時候, 這個類型參數(shù)由一個具體類型所代替.

2.1 泛型類

  下面的例子中介紹了如何創(chuàng)建一個最簡單泛型類

清單2.1, 最簡單的泛型類

            
              
public class GenSample<T> {}

            
          

  類名后面帶有<T>表明了這個類是泛型類, 其中T被成為類型參數(shù)(type parameter), 在使用泛型的時候, 類型參數(shù)可以被替換為任何的類類型, 但是不能是原始類型(primitive type), 例如int, double.

  下面通過一個列表的例子來具體說明如果聲明泛型類和類型參數(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;
	}
}

            
          

  在列表的例子中, 類型參數(shù)T被用來表示列表中的元素的類型, 即, 這個列表中的元素是T類型的.

  在使用這個列表時, 這個類型參數(shù)T會被具體的類型所替代.

  注意, 由于T時類型參數(shù)不是具體的類, 所以不能使用new操作符創(chuàng)建T的對象,例如new T(), 或者, new T[10].

2.2 泛型接口

  在J2SE 5.0中, 不僅僅可以聲明泛型類, 也可以聲明泛型接口, 聲明泛型接口和聲明泛型類的語法類似, 也是在接口命稱后面加上<T>. 例如,

清單3.2.3, 泛型接口
            
              
public interface GenInterface<T> {
    void func(T t);
}

            
          

2.3、聲明多個類型參數(shù)的泛型類或者接口

  在聲明泛型類的時候, 可是使用多個類型參數(shù). 多個類型參數(shù)之間用逗號分開, 例如,

清單3.2.4, 多個類型參數(shù)的泛型類
            
              
public class GenMap<T, V> {}

            
          

Eclipse 3.1的類創(chuàng)建向?qū)еС謩?chuàng)建泛型類, 如下圖所示,

圖2.1 使用類向?qū)?chuàng)建泛型類

圖3.2.1 使用類向?qū)?chuàng)建范型類

  使用Eclipse接口向?qū)?chuàng)建泛型接口

圖2.2 使用接口向?qū)?chuàng)建泛型接口
圖3.2.2 使用接口向?qū)?chuàng)建范型接口

  2.4 泛型方法

  類型參數(shù)(type parameter)不僅僅可以用來聲明泛型類或者泛型接口, 也可以用來聲明泛型方法, 而且這種聲明的泛型方法可以用在非泛型類中, 聲明泛型方法的一般格式是

清單2.5 泛型方法的一般形式
            
              
<type-list> return-type method-name(parameter-list) {}

            
          

清單3.2.6 泛型方法示例
            
              
public <T> String getString(T obj) {
	return obj.toString();
}

            
          

  2.5 受限泛型

  受限泛型是指類型參數(shù)的取值范圍是受到限制的. extends關(guān)鍵字不僅僅可以用來聲明類的繼承關(guān)系, 也可以用來聲明類型參數(shù)(type parameter)的受限關(guān)系.例如, 我們只需要一個存放數(shù)字的列表, 包括整數(shù)(Long, Integer, Short), 實數(shù)(Double, Float), 不能用來存放其他類型, 例如字符串(String), 也就是說, 要把類型參數(shù)T的取值泛型限制在Number極其子類中.在這種情況下, 我們就可以使用extends關(guān)鍵字把類型參數(shù)(type parameter)限制為數(shù)字,

清單2.7 受限泛型示例
            
              public class Limited<T extends Number> {
	public static void main(String[] args) {
		Limited<Integer> number;   //正確
		Limited<String> str;       //編譯錯誤
	}
}

            
          

  在Eclipse 3.1中, 上例中的編譯錯誤信息如下圖所示

圖2.3 由于受限泛型導(dǎo)致的編譯錯誤

圖3.2.3 由于受限范型導(dǎo)致的編譯錯誤

在程序中使用泛型

3.1在程序中使用泛型類

  在創(chuàng)建泛型類的對象的時候, 和創(chuàng)建普通對象基本類似, 必須提供具體的類類型來替代類型參數(shù)T (J2SE 5.0目前不支持原始類型作為類型參數(shù)(type parameter)).

清單3.1, 使用泛型類
            
              
//如果需要整型的列表
GenList<Integer> integerList = new GenList<Integer>();
//如果需要字符型的列表
GenList<String> strList = new GenList<String>();
//不能使用原始類型
GenList<int> nList = new GenList<int>();  //編譯錯誤

            
          

3.2 使用泛型解決類型安全性問題

  使用泛型實現(xiàn)的列表是類型安全的, 下列破壞類型安全語句會在編譯的時候檢查出來。 把鼠標(biāo)放在錯誤標(biāo)記上, Eclipse 3.1中的錯誤提示就會顯示,如下圖所示:

圖3.3.2 破壞類型安全引起的錯誤
圖3.3.2 破壞類型安全引起的錯誤

3.3 二義性錯誤

  GenMap在聲明是使用了2個類型參數(shù)T和V, 因此在創(chuàng)建GenMap的對象的時候也需要提供2個具體的類類型來替代這2個類型參數(shù), 例如,

清單9, 多個參數(shù)的泛型類
            
              
GenMap<Integer, String> 
              
                gm
              
               = new GenMap<Integer, String>();
GenMap<String, String> gm2 = new GenMap<String, String>();

            
          

  上例中, T和V雖然看起來是兩個不同的類型參數(shù), 但是在使用這個泛型類的時候, T和V很有可能被替換成同一種類型. 因此在聲明多個類型參數(shù)的泛型類時, 要注意避免這種二義性錯誤, 例如,

清單10, 二義性錯誤
            
              
public class GenMap<T, V> {
    //編譯錯誤, 二義性錯誤
    public void set(T t){}
    public void set(V v){}
}

            
          

  在上面這段代碼, 如果T和V被替換成同一種類型, set函數(shù)的 簽名 (signature)就是完全一樣的, 所以編譯器會報告二義性錯誤. 正確的用法是聲明2個不同名的方法, 例如,

清單10, 二義性錯誤
            
              
public class GenMap<T, V> {
    public void setKey(T t){}
    public void setValue(V v){}
}

            
          

圖3.3 二義性錯誤
圖3.3.3 二義性錯誤

3.4 使用通配符

  前面我們創(chuàng)建了泛型的列表, 如果我需要一個方法來處理泛型列表, 例如, 我們希望把列表中的每個元素都打印出來, 但是類型參數(shù)(type parameter)只能使用在聲明一個泛型類的時候, 如果類型參數(shù)使用在函數(shù)定義里會導(dǎo)致編譯錯誤。

            
              
public static void print(GenList<T> list){}	//編譯錯誤

            
          

  在這種情況下, 我們需要用另外一種方法來表示一個泛型類, 否則, 就可能需要書寫多個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中提供了泛型的通配符"?", "?"可以用來代替任何類型, 例如使用通配符來實現(xiàn)print方法。

            
              
public static void print(GenList<?> list) {}

            
          

泛型的一些局限型

  (1) 類型參數(shù)不能實例化, 例如,

            
              
T t= new T();   //編譯錯誤

            
          

  (2) 不能實例化類型參數(shù)的數(shù)組

            
              
T[] ts= new T[10];   //編譯錯誤

            
          

  (3) 類的靜態(tài)變量不能聲明為類型參數(shù)類型

            
              
public class GenClass<T> {
     private static T t;    //編譯錯誤
}

            
          

  (4) 泛型類不能繼承自Throwable以及其子類

            
              
public GenExpection<T> extends Exception{}    //編譯錯誤

            
          

泛型小結(jié)

  泛型是J2SE 5.0所提供的一項強大的功能, 使用泛型可以創(chuàng)建類型安全的、可重用的代碼, 雖然目前Java的泛型還無法和C++的泛型相提并論, 但是, 隨著Java語言本事的演進, 泛型會在Java語言中發(fā)揮更大的作用的.

Eclipse3.1中體驗J2SE5.0之泛型


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲狠狠婷婷综合久久久久图片 | 日本高清视频不卡 | 欧美日韩精品国产一区二区 | 天天综合色天天综合网 | 国产精品久久久久久久四虎电影 | 日操夜干 | www.成人.com | 免费久久一级欧美特大黄 | 亚洲精品第一国产综合高清 | 午夜精品亚洲 | 国产视频网站在线观看 | 亚洲成人福利网站 | 秋霞日韩久久理论电影 | 天天做天天爱夜夜爽女人爽宅 | 又黄又爽的网站 | 激情网五月天 | 成人午夜久久 | 欧美一级毛片不卡免费观看 | 在线不欧美 | 国产精品国产三级国产专区5o | 国产在线视频91 | 国产亚洲精品久久久久久久网站 | 奇米影视4444| 午夜直播在线 | 免费视频片在线观看大片 | 免费黄色大片在线观看 | 成年视频免费观看 | 亚洲香蕉毛片久久网站老妇人 | 免费视频爱爱太爽了 | 久久99久久 | av福利在线观看 | 久久天天躁夜夜躁狠狠 | 天天射网站 | 水野朝阳128部合集在线 | 91看片免费版 | 精品福利视频在线观看视频 | 亚洲一区无码中文字幕 | 欧美洲视频在线观看 | 欧美亚洲理伦电影毛片在线播放 | 午夜在线播放视频 | 波多野结衣三级视频 |