JAVA泛型--待续
原做法:
?
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
泛型做法:
Map<K,V> m = new HashMap()<K,V>;
m.put("key", "blarg");//非<K,V>類型無法操作
String s = m.get("key");//獲取無須強制轉換
?
1:泛型(Generic type 或者 generics),對象類型的擴展,在對象類型相同情況下的一個參數化限定。
2:好處:提高程序的類型安全,將類型檢查從運行時提前到編譯時,入參限定檢查阻止錯誤輸入,出參無須強制類型轉換。原類型可能對應的Object限定,實際運用需要更加細化。
3:它是編譯階段的類型檢查,加泛型不影響JVM和類文件,反射操作可繞過泛型限定;
4:適用對象:除了異常類型、枚舉或匿名內部類以外,任何類都可以具有類型參數
5:方式:聲明對象時,使用<>加上大寫單字母,
字母推薦: K —— 鍵,比如映射的鍵。?
V —— 值,比如 List 和 Set 的內容,或者 Map 中的值。?
E —— 異常類。?
T ——?泛型。
6:注意:泛型不是 協定?的(協定的意思:假設A擴展自B,則使用B的地方可以使用A,即A是B的一種,非協變即泛型不支持繼承,比較嚴格)
協定eg:
Integer[] intArray = new Integer[10];?
Number[] numberArray = intArray;//valid
非協定eg1:
List<Integer> intList = new ArrayList<Integer>();
List<Number> numberList = intList; // invalid
numberList.add(new Float(3.1415));//編譯出錯,此處numberList是intList引用
非協定eg2:
void printList(List l) { //入參I可能因為參數類型限定為原始類型而出現類型不安全,假設入參為List<Integer>
for (Object o : l)
System.out.println(o);
}
非協定eg3:
void printList(List<Object> l) {?//假設入參為List<Integer>,而List<Integer>不是List<Object>,參看非協變eg1.
for (Object o : l)?
System.out.println(o);?
}
由此引出 通配符 ? 通配符的引入在于可以安全檢索元素(類型的任意限定肯定是擴展自Object),而非添加元素(編譯器并不知道原類型的限定,添加是未知的,不被允許的)
非協定eg4:
void printList(List<?> l) {?//List<?> 是任何泛型?List 的父類型,所以完全可以將 List<Object>、List<Integer> 或 List<List<List<Flutzpah>>> 傳遞給 printList()
for (Object o : l)?
System.out.println(o);?
}
7:泛型類(在類定義中添加一個形式類型參數列表),根據該定義可以在多個方法簽名中實施類型約束
8:方法的泛型化與所在的類是否為泛型類無關,泛型方法用于在該方法的多個參數之間宣稱一個類型約束
eg:
public <T> T ifThenElse(boolean b, T first, T second) {//不用顯式地告訴編譯器T是什么,它只需要做到帶T的參數及返回值都是同一類型即可
return b ? first : second;
}
9:泛型類和泛型方法的選擇
a:當泛型方法是靜態方法時,編譯器無法知道該類到底是什么泛型,故不用泛型類而用泛型方法
b:當T約束僅針對方法,局部約束的時候不需要泛型類,因為泛型類的約束會導致所有的實例對象都是用的同一個T,導致該方法也是使用的同一個T,而存在這種需求:A類的實例a1和a2的方法的類型約束不需要一樣;
10:限定類型,附加約束(類-----無泛型,類類型-------一般泛型,類類型約束------帶約束泛型)
eg:
public class Matrix<V extends Number> { ... }//Matrix由哪個泛型限定不知道,但必須是Number或Number子類;若無泛型,假設由Object限定,這樣可以解釋List.get() 在 List<?> 上調用時返回 Object
public static void main(String[] args) {
Matrix<Number> in = new Matrix<Number>();//valid
Matrix<Integer> in = new Matrix<Integer>();//valid
Matrix<Float> in = new Matrix<Float>();//valid
}
?
整理自:http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html
?
轉載于:https://www.cnblogs.com/onlyEnglish/p/8784787.html
總結
以上是生活随笔為你收集整理的JAVA泛型--待续的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: py-kms使用方法
- 下一篇: 语文片断教学优秀教案一等奖