Java泛型應用淺析
Java泛型,餓,這個東西嗎,嚼一下還是有必要的。有啥用呢?小弟曾覺著吧,吹牛是條不錯的出路,但沒一次沒有不吹破的。(繞吧^_^)
詳解呢,沒啥必要了,參見附件解壓後Java泛型詳解.txt(引用網址…小弟知錯了T^T)。
一、泛型概念簡述
泛型嗎,就是泛泛的型別,指代某一種型別的符號。例如Map<K,V>,K、V指代某種型別一樣。而我們呢,在內部則直接用K、V來進行處理。
這樣有啥好處呢?1.消除強制型別轉換;2.附加型別檢查,避免錯誤型別;3.確保Java型別安全(這才是主要目的)等。相信用過集合框架的都有類似體會。
二、泛型基礎特徵
1)在定義泛型類或宣告泛型類的變數時,使用尖括號來指定形式型別引數。例如java.util.Map介面的定義:
public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
命名方式約定以大寫的單個字母名稱作為型別引數。常見泛型推薦的名稱:K,鍵;V,值;E,異常類;T,泛型。
2)泛型不是協變的,即無法向上轉型。不同於Object obj = new String(“str”),以下方式是錯誤的:
List<String> strList = new ArrayList<String>();
List<Object> objList = strList; // invalid
如果第二行寫成List objList = strList,可以通過編譯但會出現警告(型別不安全)。那如何表示泛型為一個通用泛型,就是定義個尖括號內可以放任意型別的泛型呢?這是就要使用型別萬用字元了。
3)型別萬用字元,’?’表示。可以宣告一個List<?>,作為任何泛型List的父型別。即List<?> objList = strList,這樣就沒啥問題了。
4)受限泛型,即給泛型定義上下限。簡單說,就是型別引數必須是某類及其子類(上限),或者是某類及其父類(下限)。
怎麼弄捏,例如List為傳入引數,限定型別引數必須為Number,如下:
public void fun(List<? extends Number> list) {…}
上述List只接收Number及Number的子類。另一種方式,只接收Integer及其父類,則如下:public void fun(List<? super Integer> list) {…}。
三、泛型簡單應用
OK,現在開始本文最切題的章節啦,各位看官還請拭目以待^_^!
……
參見附件-_-!
附個內容表吧:
包名
|
樣例名
|
備註
|
org.join.generic.one
|
樣例1:泛型類
|
一個和多個型別引數的泛型類
|
org.join.generic.two
|
樣例2:萬用字元
|
輸出了泛型類成員變數型別
|
org.join.generic.three
|
樣例3:受限泛型
|
extends、super
|
org.join.generic.four
|
樣例4:泛型介面
|
泛型介面及其實現
|
org.join.generic.five
|
樣例5:泛型方法
|
返回泛型示例、統一引數型別
|
org.join.generic.six
|
樣例6:泛型陣列
|
泛型陣列使用
|
org.join.generic.seven
|
樣例7:泛型巢狀
|
Map&List巢狀
|
四、後記
手冷,嗚嗚…