天天看點

泛型、上下界通配符泛型的定義泛型的使用

       泛型程式設計(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>的使用:這裡單獨拿出來示例,主要是這種用法十分常見:

泛型、上下界通配符泛型的定義泛型的使用

使用&來進行且操作:

  1. extends後既可以跟類,也可以跟接口;而&後必須跟接口。
  2. 使用&,可以對泛型進一步限制,達到且的效果。
泛型、上下界通配符泛型的定義泛型的使用

<? 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

^_^ 本文已經被收錄進《程式員成長筆記(三)》,筆者JustryDeng