標籤:
仿製藥Java SE 1.5新功能。通用自然是參數化型別。即操作資料類型被指定為一個參數。這樣的參數類型可以在課堂上使用、建立的介面和方法,他們被稱為通用類、、泛型方法。
Java語言引入泛型的優點是安全簡單。
規則和限制
1、泛型的類型參數僅僅能是類類型(包含自己定義類),不能是簡單類型。
2、同一種泛型能夠相應多個版本號碼(由於參數類型是不確定的),不同版本號碼的泛型類執行個體是不相容的。
3、泛型的類型參數能夠有多個。
4、泛型的參數類型能夠使用extends語句。比如<T extends superclass>。習慣上稱為“有界類型”。
5、泛型的參數類型還能夠是萬用字元類型。
比如Class<?> classType = Class.forName("java.lang.String")。
限制泛型
我們通常是這樣定義泛型的:class Generics<T>。實際上這裡的限定類型相當於Object,這和“Object泛型”實質是一樣的。什麼是限制比方我們要限制T為集合介面類型。
僅僅須要這麼做:class Generics<T extends Collection>。這樣類中的泛型T僅僅能是Collection介面的實作類別,傳入非Collection介面編譯會出錯。
注意:<T extends Collection>這裡的限定使用keywordextends。後面能夠是類也能夠是介面。但這裡的extends已經不是繼承的含義了。應該理解為T類型是實現Collection介面的類型。或者T是繼承了XX類的類型。
public class CollectionGen<T extends Collection> {private T t;public CollectionGen(T t) {this.t = t;}public T getT() {return t;}public void setT(T t) {this.t = t;}public static void main(String args[]) {CollectionGen<ArrayList> genList = null;genList = new CollectionGen<ArrayList>(new ArrayList());//下面代碼不能通過編譯//CollectionGen<Collection> genCollention = null;//genCollention=new CollectionGen<ArrayList>(new ArrayList());System.out.println("能夠編譯通過並執行!");}}
上面的代碼是能夠編譯通過並成功執行的。可是開啟凝視掉的兩行就出錯了。由於<T extends Collection>這麼定義類型的時候。就限定了構造此類執行個體的時候T是確定的一個類型。這個類型實現了Collection介面。簡單一句話就是:上面這樣的方式。定義跟執行個體化的類型必須全然一致。
萬用字元泛型
為瞭解決類型被限制死了不能動態依據執行個體來確定的缺點,引入了“萬用字元泛型”。針對上面的範例,使用通配泛型格式為<? extends Collection>,“?”代表未知類型,這個類型是實現Collection介面。那麼上面實現的方式能夠寫為:
public static void main(String args[]) {Generics<ArrayList> genList = null;genList = new Generics<ArrayList>(new ArrayList());//下面代碼能夠通過編譯Generics<? extends Collection> genCollention = null;genCollention=new Generics<ArrayList>(new ArrayList());System.out.println("能夠編譯通過並執行!");}
1、假設僅僅指定了<?
>,而沒有extends,則預設是同意Object及其下的不論什麼Java類了。也就是隨意類。
2、萬用字元泛型不單能夠向下限制。如<? extends Collection>,還能夠向上限制,如<? super Double>,表示類型僅僅能接受Double及其上層父類類型,如Number、Object類型的執行個體。
3、泛型類定義能夠有多個泛型參數。中間用逗號隔開,還能夠定義泛型介面。泛型方法。
這些都與泛型類中泛型的使用規則相似。
多介面限制
儘管Java泛型簡單的用 extends 統一的表示了原有的 extends 和 implements 的概念,但仍要遵循應用的體系,Java 僅僅能繼承一個類,但能夠實現多個介面,所以你的某個類型須要用 extends 限定,且有多種類型的時候。僅僅能存在一個是類。而且類寫在第一位,介面列在後面。也就是:<T extends SomeClass & interface1 & interface2 & interface3>
這裡的範例僅示範了泛型方法的類型限定,對於泛型類中類型參數的限制用全然一樣的規則,僅僅是加在類聲明的頭部,如:
public class Demo<T extends Comparable & Serializable>{//T類型就能夠用Comparable聲明的方法和Seriablizable所擁有的特性了}
最後,強調一點,是最關鍵的資料是提高通用代碼的安全性,由於它的編譯能力檢查代碼,從而避免異常非常強的依次類型的實現發生。
瞭解仿製藥的目的,我相信你會知道如何使用它泛型!
最佳新秀Java(22)——再次瞭解泛型