泛型程式設計(Generic Programming)意味着編寫的代碼可以被很多不同類型的對象所重用。即:将一些可以進行相同操作的類或元素等進行抽象化,為其共有的特性寫一個通用的方法。
泛型的定義
泛型是JDK1.5的一項新特性,它的本質是參數化類型(Parameterized Type)的應用,也就是說所操作的資料類型被指定為一個參數,在用到的時候再指定具體的類型。這種參數類型可以用在類、接口和方法的建立中,分别稱為泛型類、泛型接口和泛型方法。
Java泛型的常用辨別符、(上下界)通配符:
辨別符 | 說明 |
E(Element) | 一般在集合中使用,因為集合中存放的是元素。如:List<E>,Iterator<E>,Set<E> |
T(Type) | java類(當需要多個類時,可使用 S、U、V - 2nd、3rd、4th Types),如:String、Integer、Double等 |
K(Key) | 鍵 |
V(Value) | 值 |
N(Number) | 數值類型 |
? | 表示不确定的java類型(即:支援各種類型) |
? extends T | 上界通配符 |
? super T | 下界通配符 |
…… |
注:實際上如果我們自己在建立泛型類時,也不一定非要寫上述的字母,任意字母都可以,隻要該類統一即可。
追注:但推薦按照約定的來命名泛型。
注:如果不指定泛型,那麼預設泛型為Object。
泛型的使用
接口---泛型:

實作
類---泛型:
方法(函數)---泛型:
Class<T>的使用:這裡單獨拿出來示例,主要是這種用法十分常見:
使用&來進行且操作:
- extends後既可以跟類,也可以跟接口;而&後必須跟接口。
- 使用&,可以對泛型進一步限制,達到且的效果。
<? extends T>上界通配符(Upper Bounds Wildcards):
情況說明
從上面的泛型可知:引用與具體執行個體的泛型是保持一緻的,如:
但是在某些時候我們在建立執行個體時,需要用到T的某個子類來“填充”引用中的泛型T,而非T本身來填充引用中的泛型T,
這樣行不行呢?
如(假設我們建立了Fruit和Apple類,且Apple類繼承了Fruit類):
上圖報錯,說明上圖這樣是不行的!但是在實際業務中,我們很可能會遇到需要用等号左側泛型的子類泛型來填
充左側泛型的情況,那麼此時怎麼辦呢?使用<? extends T>可解決此問題。
使用<? extends T>的示例:
注:<? extends T>之是以叫上界通配符,是因為T是所有?的父類,即到頂就是T了(我們一般不把Object考慮在内)。
注:我們一般可以從<? extends T>中擷取資料,雖然子類是?并不明确,但是由于子類?對象可以賦給基類T引用,
在使用時T必定是明确唯一的,是以我們取出來的?可以賦給T來進行使用。
<? super T>下界通配符(Lower Bounds Wildcards):
情況說明
? super T與<? extends T>情況相反:
<? extends T>是将左側泛型的子類?(或其本身)賦給左側的泛型引用;而? super T則是将左側泛型的父類?(或其本身)賦給左側的泛型引用。
如(假設我們建立了Fruit和Apple類,Fruit類是Apple類的父類):
注:<? super T>之是以叫下界通配符,是因為T是所有?的子類,即到最下面就是T了。
注:我們一般可以往<? super T>中setter ?執行個體,而不取;因為getter獲得的對象隻能以Object來接,因為你不知道
你get的到底是T的哪一個父類,如果使用Object來接的話,是會損失一部分該對象的功能的。
^_^ 如有不當之處,歡迎指正
^_^ 參考連結:
https://www.cnblogs.com/drizzlewithwind/p/6100164.html
https://blog.csdn.net/qq_27093465/article/details/73229016
https://www.cnblogs.com/duanxz/p/3896773.html