泛型、上下界萬用字元
宣告:本人最近特忙,此篇部落格發得很倉促;等後面閒下來了,本人會再次深入學習並演示泛型。
泛型程式設計(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來接的話,是會損失一部分該物件的功能的。