JAVA 泛型總結

1、概述:把元素的類型設計成一個參數,這個類型參數叫做泛型。
    2、集合中泛型:
        ①集合接口或集合類在jdk5.0時修改爲帶泛型的結構
        ②在實例化集合類時,可以指明具體的泛型類型
        ③指明完以後,在集合類或接口中凡是定義類或接口時,內部結構(比如:方法、構造器、屬性等)使用到類的泛型的位置,
            都指定爲實例化的泛型類型。比如:add(E e) -->實例化後:add(Integer e)
        ④注意點:泛型的類型必須是類,不能是基本數據類型,可以是基本數據類型包裝類;需要用到基本數據類型的位置,拿包裝類替換
        ⑤如果實例化時,沒有指明泛型的類型。默認類型爲Java.lang.Object類型
    3、如果自定義泛型結構:泛型類、泛型接口、泛型方法
        1、泛型類可以有多個參數,應將多個參數放到一起,例如:<E1,E2,E3>
        2、泛型類的構造器:public GenericClass(){}
        3、實例化以後,原來的泛型位置的結構必須與指定的泛型類型一致
        4、泛型的不同引用不能互相賦值:編譯時ArrayList<String>和ArrayList<Integer>是兩種類型,運行時只有一個ArrayList被加載到JVM中
        5、泛型如果不指定,將會被擦除,泛型對應的類型均按照爲Object處理,但不等價於Object
            建議:泛型使用都用,否則都不用
        6、如果泛型類是一個接口或一個抽象類,則可以不創建泛型類的對象
        7、JDK7,泛型簡化操作:ArrayList<Fruit> arr = new ArrayList<>(); 
        8、泛型指定中不能使用基本數據類型,可以使用包裝類
        9、在類/接口中聲明的泛型,在本類或本接口中即代表某種類型,可以作爲非靜態屬性的類型、非靜態方法的參數類型、非靜態方法的返回值類型,
            在靜態方法中不能使用泛型
        10、異常類不能是泛型
        11、不能使用new E[],可以使用E[] elements = (E[])new Object[capacity]
            參考:ArrayList源碼中聲明:Object[] elementData,而非泛型參數類型數組
        12、父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型類型
            ①子類不保留父類的泛型:按需實現
                沒有類型 擦除
                具體類型
            ②子類保留父類泛型:泛型子類
                全部保留
                部分保留
            結論:子類必須是"富二代",子類除了指定或保留父類的泛型,還可以增加自己的泛型
        泛型方法:
            class Father<T1,T2>{}
            子類不保留父類的泛型
            ①沒有類型,擦除
            class Son<A,B> extends Father{//等價於class son extends Father<Object,Object>}
            ②具體類型
            class Son<A,B> extends Father<String, Integer>{}
            子類保留父類泛型
            ①全部保留
            class Son<T1,T2,A,B> extends Father<T1,T2>{}
            ②部分保留
            class Son<T2,A,B> extends Father<Integer,T2>{}
        泛型繼承方面:
            ①雖然類A是類B的父類,但是G<A>和G<B>二者不具備子父類關係,二者是並列關係
                補充:類A是類B的父類,A<G>是B<G>父類
        通配符使用:通配符:?
            A是類B的父類,G<A>和G<B>沒有關係,二者共同的父類時G<?>
            ①通配符指定上限:
                上限extends:使用時指定的類型必須是繼承某個類,或者實現某個接口,即:<=
            ②通配符指定下限:
                下限super:使用時指定的類型不能小於操作的類,即:>=
            舉例:<? extends Number> (無窮小,Number] 只允許泛型爲Number或Number子類引用調用
                  <? super Nunber> [Number,無窮大) 只允許泛型爲Number或Number父類引用調用
                  <? extends Comparable> 只允許泛型爲實現Comparable接口的實現類的引用調用

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