Java範型介紹

1、自定義範型結構:範型類、範型接口、範型方法

範型類、範型接口在實例化時,如果沒有指明範型,將被擦除,認爲此範型類型爲Object

泛型類可能有多個參數,此時應將多個參數一起放在尖括號內。比如: <E1,E2,E3>

泛型類的構造器如下:public GenericClass(){}

泛型的指定中不能使用基本數據類型,可以使用包裝類替換。

在類/接口上聲明的泛型,在本類或本接口中即代表某種類型,可以作爲非靜態屬性的類型、非靜態方法的參數類型、非靜態方法的返回值類型。但在靜態方法中不能使用類的泛型。

不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity];

異常類不能是泛型的

父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型類型:

子類不保留父類的泛型:按需實現
    沒有類型 擦除
    具體類型
子類保留父類的泛型:泛型子類
    全部保留
    部分保留
結論:子類必須是“富二代”,子類除了指定或保留父類的泛型,還可以增加自己的泛型
 
2、範型方法
 
泛型方法的格式:

[訪問權限] <泛型> 返回類型 方法名([泛型標識 參數名稱]) 拋出的異常

不是說在方法中使用了範型就是範型方法,

範型方法:在方法中出現了範型的結構,範型參數與類的範型參數沒有關係,與範型方法所屬的類是不是範型類都沒有關係。

3、範型與繼承

如果BA的一個子類型(子類或者子接口),而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]
只允許泛型爲NumberNumber子類的引用調用
<? super Number> [Number , 無窮大)
只允許泛型爲NumberNumber父類的引用調用
<? extends Comparable>
只允許泛型爲實現Comparable接口的實現類的引用調用

 

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