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接口的實現類的引用調用
JAVA 泛型總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.