展開全部
在上面的例子中,由于沒有限制class GenericsFoo類型持有者T的范圍,實際上這里32313133353236313431303231363533e59b9ee7ad9431333339666666的限定類型相當于Object,這和“Object泛型”實質是一樣的。限制比如我們要限制T為集合接口類型。只需要這么做:
class GenericsFoo,這樣類中的泛型T只能是Collection接口的實現類,傳入非Collection接口編譯會出錯。
注意:這里的限定使用關鍵字extends,后面可以是類也可以是接口。但這里的extends已經不是繼承的含義了,應該理解為T類型是實現Collection接口的類型,或者T是繼承了XX類的類型。
下面繼續對上面的例子改進,我只要實現了集合接口的類型: public?class?CollectionGenFoo?{????private?T?x;????public?CollectionGenFoo(T?x)?{????????this.x?=?x;????}????public?T?getX()?{????????return?x;????}????public?void?setX(T?x)?{????????this.x?=?x;????}}實例化的時候可以這么寫: public?class?CollectionGenFooDemo?{????public?static?void?main(String?args[])?{????????CollectionGenFoo?listFoo?=?null;????????listFoo?=?new?CollectionGenFoo(new?ArrayList());????????//?出錯了,不讓這么干。????????//?原來作者寫的這個地方有誤,需要將listFoo改為listFoo1????????//?需要將CollectionGenFoo改為CollectionGenFoo????????//?CollectionGenFoo?listFoo1?=?null;????????//?listFoo1=new?CollectionGenFoo(new?ArrayList());????????System.out.println("實例化成功!");????}}當前看到的這個寫法是可以編譯通過,并運行成功。可是注釋掉的兩行加上就出錯了,因為這么定義類型的時候,就限定了構造此類實例的時候T是確定的一個類型,這個類型實現了Collection接口,但是實現 Collection接口的類很多很多,如果針對每一種都要寫出具體的子類類型,那也太麻煩了,我干脆還不如用Object通用一下。別急,泛型針對這種情況還有更好的解決方案,那就是“通配符泛型”。 雖然Java泛型簡單的用 extends 統一的表示了原有的 extends 和 implements 的概念,但仍要遵循應用的體系,Java 只能繼承一個類,但可以實現多個接口,所以你的某個類型需要用 extends 限定,且有多種類型的時候,只能存在一個是類,并且類寫在第一位,接口列在后面,也就是:
這里的例子僅演示了泛型方法的類型限定,對于泛型類中類型參數的限制用完全一樣的規則,只是加在類聲明的頭部,如: public?class?Demo?{????//?T類型就可以用Comparable聲明的方法和Seriablizable所擁有的特性了} 為了解決類型被限制死了不能動態根據實例來確定的缺點,引入了“通配符泛型”,針對上面的例子,使用通配泛型格式為 extends Collection>,“?”代表未知類型,這個類型是實現Collection接口。那么上面實現的方式可以寫為: public?class?CollectionGenFooDemo?{????public?static?void?main(String?args[])?{????????CollectionGenFoo?listFoo?=?null;????????listFoo?=?new?CollectionGenFoo(new?ArrayList());????????//?出錯了,不讓這么干。????????//?原來作者寫的這個地方有誤,需要將listFoo改為listFoo1????????//?CollectionGenFoo?listFoo1?=?null;????????//?listFoo1=new?CollectionGenFoo(new?ArrayList());????????System.out.println("實例化成功!");????}}注意:
1、如果只指定了>,而沒有extends,則默認是允許Object及其下的任何Java類了。也就是任意類。
2、通配符泛型不單可以向下限制,如 extends Collection>,還可以向上限制,如 super Double>,表示類型只能接受Double及其上層父類類型,如Number、Object類型的實例。
3、泛型類定義可以有多個泛型參數,中間用逗號隔開,還可以定義泛型接口,泛型方法。這些都與泛型類中泛型的使用規則類似。