泛型(筆記)

一、爲什麼要有泛型(Generic)?
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筆記:


   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章