1. 程式人生 > >泛型、上下界萬用字元

泛型、上下界萬用字元

宣告:本人最近特忙,此篇部落格發得很倉促;等後面閒下來了,本人會再次深入學習並演示泛型。

泛型程式設計(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 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來接的話,是會損失一部分該物件的功能的。

宣告:本人記得較倉促,很多地方沒有給出明確示例,較抽象!後期有機會的話,再學習並         分享泛型知識。

微笑如有不當之處,歡迎指正

微笑本文已經被收錄進《程式設計師成長筆記(三)》,筆者JustryDeng