------- android培訓、java培訓、期待與您交流!
----------
一、泛型的出現:
1、泛型是在JDK1.5以後出現的新特性。泛型是用於解決安全問題的,是一個安全機制。
2、JDK1.5的集合類希望在定義集合時,明確表明你要向集合中裝入那種類型的數據,無法加入指定類型以外的數據。
3、泛型是提供給javac編譯器使用的可以限定集合中的輸入類型說明的集合時,會去掉“類型”信息,使程序運行效率不受影響,對參數化的泛型類型,getClass()方法的返回值和原始類型完全一樣。
4、由於編譯生成的字節碼會去掉泛型的類型信息,只要能跳過編譯器,就可以往某個泛型集合中加入其它類型的數據,如用反射得到集合,再調用add方法即可。
二、好處:
1、使用泛型集合,可將一個集合中的元素限定爲一個特定類型,集合中只能存儲同一個類型的對象;這樣就將運行時期出現的問題ClassCastException轉移到了編譯時期,方便與程序員解決問題,讓運行時期問題減少,提高安全性。
2、當從集合中獲取一個對象時,編譯器也可知道這個對象的類型,不需要對對象進行強制轉化,避免了強制轉換的麻煩,這樣更方便。
三、泛型格式:
通過<>來定義要操作的引用數據類型
如:TreeSet<String> -----> 來定義要存入集合中的元素指定爲String類型
四、泛型定義中的術語:
如:ArrayList<E>類和ArrayList<Integer>
1、ArrayList<E>整個稱爲泛型類型
2、ArrayList<E>中的E稱爲類型變量或類型參數
3、整個ArrayList<Integer>稱爲參數化類型
4、ArrayList<Integer>中的Integer稱爲類型參數的實例或實際類型參數
5、ArrayList<Integer>中的<>稱爲typeof
6、ArrayList稱爲原始類型
五、在使用java提供的對象時,何時寫泛型?
通常在集合框架中很常見,只要見到<>就要定義泛型,其實<>就是用來接收類型的,當使用集合時,將集合中要存儲的數據類型作爲參數傳遞到<>中即可。
六、關於參數化類型的幾點說明:
1、參數化類型與原始類型的兼容性
第一、參數化類型可引用一個原始類型的對象,編譯只是報警告,能不能通過編譯,是編譯器說了算。
如:Collection<String> coll = new Date();
第二、原始類型可引用一個參數化類型的對象,編譯報告警告
如:Collection coll = new Vector<String>();
原來的方法接受一個集合參數,新類型也要能傳進去。
2、參數的類型不考慮類型參數的繼承關係:
Vector<String> v = new Vector<Objec>();//false
不寫Object沒錯
Vector<Objec> v = new Vector<String>();//錯誤的
3、在創建數組實例時,數組的元素不能使用參數化的類型
如:Vector<Integer> v[] = newVector<Integer>[10];//false
代碼體現:
HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>>(); //泛型
//廷加元素。
HashMap<String,String> yr = new HashMap<String, String>();
yr.put("01","zhangsan");
yr.put("02", "lisi");
czbk.put("yr", yr);
HashMap<String,String> jy = new HashMap<String, String>();
六、泛型中的通配符?
當傳入的類型不確定時,可以使用通配符?
1、使用?通配符可引用其他各種類型化的類型,通配符的變量主要用作引用,也可調用與參數化無關的方法,但不能調用與參數化有關的方法。
2、可對通配符變量賦任意值:
代碼體現:
public static void printFx(Collection<?> c){
for(Object obj : c){
System.out.println(obj);
}
七、泛型方法:
1、何時定義泛型方法:爲了讓不同方法可以操作不同的類型,而且類型不確定,那麼就可以定義泛型方法
2、特殊之處:靜態方法不可以訪問類上定義的泛型,如果靜態方法操作的引用數據類型不確定,可以將泛型定義在方法上。
二、泛型方法的特點:
1、位置:用於放置泛型的類型參數的<>應出現在方法的其他所有修飾符之後和在方法的返回類型之前,也就是緊鄰返回值之前,按照慣例,類型參數通常用單個大寫字母表示。
2、只有引用類型才能作爲泛型方法的實際參數
3、除了在應用泛型時可以使用extends限定符,在定義泛型時也可以使用extends限定符。
4、普通方法、構造函數和靜態方法中都可以使用泛型。
5、可以用類型變量表示異常,稱之爲參數化的異常,可用於方法的throws列表中,但是不能用於catch子句中。
6、在泛型中可同時有多個類型參數,在定義它們的<>中用逗號分開。
代碼體現:
public static <K,V> V getValue(K key){
Map<K, V> map = new HashMap<K, V>();
return map.get(key);