1、自定義範型結構:範型類、範型接口、範型方法
範型類、範型接口在實例化時,如果沒有指明範型,將被擦除,認爲此範型類型爲Object
泛型類可能有多個參數,此時應將多個參數一起放在尖括號內。比如: <E1,E2,E3>
泛型類的構造器如下:public GenericClass(){}。
泛型的指定中不能使用基本數據類型,可以使用包裝類替換。
在類/接口上聲明的泛型,在本類或本接口中即代表某種類型,可以作爲非靜態屬性的類型、非靜態方法的參數類型、非靜態方法的返回值類型。但在靜態方法中不能使用類的泛型。
不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity];
異常類不能是泛型的
父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型類型:
子類不保留父類的泛型:按需實現
沒有類型 擦除
具體類型
子類保留父類的泛型:泛型子類
全部保留
部分保留
結論:子類必須是“富二代”,子類除了指定或保留父類的泛型,還可以增加自己的泛型
2、範型方法
泛型方法的格式:
[訪問權限] <泛型> 返回類型 方法名([泛型標識 參數名稱]) 拋出的異常
不是說在方法中使用了範型就是範型方法,
範型方法:在方法中出現了範型的結構,範型參數與類的範型參數沒有關係,與範型方法所屬的類是不是範型類都沒有關係。
3、範型與繼承
如果B是A的一個子類型(子類或者子接口),而G是具有泛型聲明的類或接口,G<B>並不是G<A>的子類型。
4、通配符的使用
使用類型通配符:?。
List<?>是List<String>、List<Object>等各種泛型List的父類。
寫入list中的元素時,不行。因爲我們不知道list的元素類型,我們不能向其中 添加對象。
--------唯一的例外是null,它是所有類型的成員。
讀取List<?>的對象list中的元素時,永遠是安全的,因爲不管list的真實類型是什麼,它包含的都是Object。
注意:
注意點1:編譯錯誤:不能用在泛型方法聲明上,返回值類型前面<>不能使用?
注意點2:編譯錯誤:不能用在泛型類的聲明上
注意點3:編譯錯誤:不能用在創建對象上,右邊屬於創建集合對象
5、有限制的通配符
<?>
允許所有泛型的引用調用
通配符指定上限
上限extends:使用時指定的類型必須是繼承某個類,或者實現某個接口,即<=
通配符指定下限
下限super:使用時指定的類型不能小於操作的類,即>=
舉例:
<? extends Number> (無窮小 , Number]
只允許泛型爲Number及Number子類的引用調用
<? super Number> [Number , 無窮大)
只允許泛型爲Number及Number父類的引用調用
<? extends Comparable>
只允許泛型爲實現Comparable接口的實現類的引用調用