1. 解決元素存儲的安全性問題
2. 解決獲取數據元素時,需要類型強轉的問題
3. 泛型,JDK1.5新加入的
4. 常用T表示 , T只能是類,不能用基本數據類型填充。(使用泛形時,泛形類型須爲引用類型,不能是基本數據類型)
泛型的實例化:
一定要在類名後面指定類型參數的值(類型)。如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
5. 靜態方法中不能使用類的泛型。
6. 如果泛型類是一個接口或抽象類,則不可創建泛型類的對象(這不是廢話嗎,接口類和抽象類都不能直接創建對象)
7. 不能在catch中使用泛型
8. 從泛型類派生子類,泛型類型需具體化(例如:在MVC 設計模式中,底層模板BaseAction,BaseService,BaseDao三個抽象泛型類模板,用於被繼承)
9. 泛型不存在繼承關係。
10.一個很有用的方法: void drawAll(List<? extends Shape> shapes){//..} 方法中的參數可以接收Shape 的子類
11. 一個典型的錯誤:
static void fromArrayToCollection(Object[] a,Collection<?> c){
for(Object o : a){
c.add(o);//編譯錯誤
}
}
正確:(這樣就能遍歷任何任何集合)
static void fromArrayToCollection(T[] a,Collection<T> c){
for(Object o : a){
c.add(o);//正確
}
}
二、泛型-深入
注意:泛型是提供給javac編譯器使用的,它用於限定集合的輸入類型,讓編譯器在源代碼級別上,即擋住向集合中插入非法數據。但編譯器編譯帶有泛形的集合時,會去掉“類型”信息,使程序運行效率不受到影響,這個過程稱之爲“擦除”
由於編譯生成的字節碼會去掉泛型的類型信息,所以只要能跳過編譯器(沒有語法錯誤),就可以往某個泛型集合中加入其他類型的數據。使用反射測試結果。
以下是ppt筆記: