Java的泛型解析

一尚揣、為什么要使用泛型

1.類型參數(shù)的好處

  • 類型安全:泛型的主要目標(biāo)是提高 Java 程序的類型安全。通過(guò)知道使用泛型定義的變量的類型限制摆出,編譯器可以在一個(gè)高得多的程度上驗(yàn)證類型假設(shè)朗徊。沒(méi)有泛型,這些假設(shè)就只存在于程序員的頭腦中(或者如果幸運(yùn)的話偎漫,還存在于代碼注釋中)爷恳。

  • 消除強(qiáng)制類型轉(zhuǎn)換:泛型的一個(gè)附帶好處是,消除源代碼中的許多強(qiáng)制類型轉(zhuǎn)換象踊。這使得代碼更加可讀温亲,并且減少了出錯(cuò)機(jī)會(huì)棚壁。

Java語(yǔ)言引入泛型的好處是安全簡(jiǎn)單。泛型的好處是在編譯的時(shí)候檢查類型安全栈虚,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的袖外,提高代碼的重用率。


二魂务、定義簡(jiǎn)單的泛型類

泛型類的定義比較簡(jiǎn)單曼验,如下便可以定義一個(gè)泛型類,在實(shí)例化泛型類的時(shí)候必須指明泛型的具體類型头镊。

public class Pair<T>{
    private T first;
    private T second;
    
    public Pair(){
        first = null;second = null;
    }
    
    public T getFirst(){
        return first;
    }
    
    public T getSecond(){
        return second;
    }
    
    public void setFirst(T newValue){
        first = newValue;
    }
    public void setSecond(T newValue){
        second = newValue;
    }
}

泛型在使用中還有一些規(guī)則和限制:

  • 泛型的類型參數(shù)只能是類類型(包括自定義類)蚣驼,不能是簡(jiǎn)單類型。
  • 同一種泛型可以對(duì)應(yīng)多個(gè)版本(因?yàn)閰?shù)類型是不確定的)相艇,不同版本的泛型類實(shí)例是不兼容的颖杏。
  • 泛型的類型參數(shù)可以有多個(gè)。
  • 泛型的參數(shù)類型可以使用extends語(yǔ)句坛芽,例如<T extends superclass>留储。習(xí)慣上成為“有界類型”。
  • 泛型的參數(shù)類型還可以是通配符類型咙轩。例如Class<?> classType = Class.forName(Java.lang.String);

泛型類可以定義多個(gè)類型變量获讳,例如

public class Pari<T,U>{
    ...
}

三、泛型方法

Java中的泛型方法相對(duì)復(fù)雜一點(diǎn)活喊,在調(diào)用的時(shí)候需要指明泛型類型

定義泛型的語(yǔ)法:

image

調(diào)用泛型的語(yǔ)法:

image

定義泛型方法時(shí)丐膝,必須在返回值前邊加一個(gè)<T>,來(lái)聲明這是一個(gè)泛型方法钾菊,持有一個(gè)泛型T帅矗,然后才可以用泛型T作為方法的返回值。注意:類型變量放在修飾符的后面煞烫,返回類型的前面浑此。

既然是泛型方法,就代表著我們不知道具體的類型是什么滞详,也不知道構(gòu)造方法如何凛俱,因此沒(méi)有辦法去new一個(gè)對(duì)象,但可以利用變量c的newInstance方法去創(chuàng)建對(duì)象料饥,也就是利用反射創(chuàng)建對(duì)象蒲犬。

泛型方法要求的參數(shù)是Class<T>類型,而Class.forName()方法的返回值也是Class<T>稀火,因此可以用Class.forName()作為參數(shù)暖哨。其中,forName()方法中的參數(shù)是何種類型,返回的Class<T>就是何種類型篇裁。在本例中沛慢,forName()方法中傳入的是User類的完整路徑,因此返回的是Class<User>類型的對(duì)象达布,因此調(diào)用泛型方法時(shí)团甲,變量c的類型就是Class<User>,因此泛型方法中的泛型T就被指明為User黍聂,因此變量obj的類型為User躺苦。


四、類型變量的限定

我們都知道在方法前指定了<T>产还,那么就是說(shuō)這個(gè)泛型類型和類定義時(shí)的泛型類型無(wú)關(guān)匹厘,所以可以在普通類中定義泛型方法,泛型可以限定類型變量必須實(shí)現(xiàn)某幾種接口或者繼承某個(gè)雷脐区,多個(gè)限定類型通過(guò)&分隔愈诚,如:

public static <T extends Comparable> T min(T[] a)...

對(duì)泛型進(jìn)行限制,使其只有集成或?qū)崿F(xiàn)Comparable的類才能使用該方法

(1) ? extends X:表示類型的上界

特點(diǎn):

  • 限定 ? 為 X 的子類型牛隅,但不知道是哪個(gè)子類型
  • 可以安全的訪問(wèn)數(shù)據(jù)炕柔,訪問(wèn)X及其子類型
<T extends BoundingType>

T表示綁定類型的子類型,T和綁定類型可以是類或者接口媒佣。

一個(gè)變量或者通配符可以綁定多個(gè)限定匕累,用“&”分開

T extends Comparable & Serializable

若T的限定類型是類,則有且最多只有一個(gè)默伍,且放于接口前面


五欢嘿、泛型代碼和虛擬機(jī)

Java虛擬機(jī)是不存在泛型類型對(duì)象的,所有的對(duì)象都屬于普通類也糊,甚至在泛型實(shí)現(xiàn)的早起版本中际插,可以將使用泛型的程序編譯為在1.0虛擬機(jī)上能夠運(yùn)行的class文件,這個(gè)向后兼容性后期被拋棄了显设,所以后來(lái)如果用Sun公司的編譯器編譯的泛型代碼,是不能運(yùn)行在Java5.0之前的虛擬機(jī)的辛辨,這樣就導(dǎo)致了一些實(shí)際生產(chǎn)的問(wèn)題捕捂,如一些遺留代碼如何跟新的系統(tǒng)進(jìn)行銜接,要弄明白這個(gè)問(wèn)題斗搞,需要先了解一下虛擬機(jī)是怎么執(zhí)行泛型代碼的指攒。

1.類型擦除

類型擦除指的是通過(guò)類型參數(shù)合并,將泛型類型實(shí)例關(guān)聯(lián)到同一份字節(jié)碼上僻焚。編譯器只為泛型類型生成一份字節(jié)碼允悦,并將其實(shí)例關(guān)聯(lián)到這份字節(jié)碼上。類型擦除的關(guān)鍵在于從泛型類型中清除類型參數(shù)的相關(guān)信息虑啤,并且再必要的時(shí)候添加類型檢查和類型轉(zhuǎn)換的方法隙弛。

虛擬機(jī)的一種機(jī)制:擦除類型參數(shù)架馋,并將其替換成限定類型,沒(méi)有限定類型用Object代替

public class Period<T extends Comparable<T> & Serializable> {  
      private T begin;  
      private T end;  
  
      public Period(T one, T two) {  
               if (one.compareTo(two) > 0) {begin = two;end = one;  
              } else {begin = one;end = two;}  
     }  
}  

//擦除后
public class Period implements Serializable{  
      private Comparable begin;  
      private Comparable end;  
  
      public Period(Comparable one, Comparable two) {  
               if (one.compareTo(two) > 0) {begin = two; end = one;  
              } else {begin = one; end = two;}  
     }  
}  

Java泛型的處理幾乎都在編譯器中進(jìn)行全闷,編譯器生成的字節(jié)碼是不包涵泛型信息的叉寂,泛型類型信息將在編譯處理是被擦除,這個(gè)過(guò)程即類型擦除总珠。通常情況下屏鳍,Java是通過(guò)以下方式處理泛型:Java編譯器通過(guò)Code sharing方式為每個(gè)泛型類型創(chuàng)建唯一的字節(jié)碼表示,并且將該泛型類型的實(shí)例都映射到這個(gè)唯一的字節(jié)碼表示上局服。將多種泛型類形實(shí)例映射到唯一的字節(jié)碼表示是通過(guò)類型擦除(type erasue)實(shí)現(xiàn)的钓瞭。

Code sharing:對(duì)每個(gè)泛型類只生成唯一的一份目標(biāo)代碼;該泛型類的所有實(shí)例都映射到這份目標(biāo)代碼上淫奔,在需要的時(shí)候執(zhí)行類型檢查和類型轉(zhuǎn)換山涡。

注意:
當(dāng)存在情況:class Interval<T extends Serializable & Comparable> ,原始類型用Serializable替換T搏讶,在有必要的時(shí)候向Comparable強(qiáng)制類型轉(zhuǎn)換佳鳖,為了提高效率,應(yīng)該將沒(méi)有方法的接口放在列表的后面媒惕。

類型擦除帶來(lái)的靈異問(wèn)題:

  • 無(wú)法用同一泛型類型的實(shí)例區(qū)分方法簽名
    public class Erasure{  
  
            public void test(List<String> ls){  
                System.out.println("Sting");  
            }  
            public void test(List<Integer> li){  
                System.out.println("Integer");  
            }  
    }
image
image
  • 不能同時(shí)catch同一泛型異常類的多個(gè)實(shí)例
  • 泛型類的靜態(tài)變量是可以共享的
import java.util.*;  
  
public class StaticTest{  
    public static void main(String[] args){  
        GT<Integer> gti = new GT<Integer>();  
        gti.var=1;  
        GT<String> gts = new GT<String>();  
        gts.var=2;  
        System.out.println(gti.var);  
    }  
}  
class GT<T>{  
    public static int var=0;  
    public void nothing(T x){}  
}

//輸出2

2.翻譯泛型表達(dá)式

Couple<Employee> couple = ...;  
Employee wife = couple.getWife();  

擦除后系吩,getWife()返回的是Object類型,然后虛擬機(jī)會(huì)插入強(qiáng)制類型轉(zhuǎn)換妒蔚,將Object轉(zhuǎn)換為Employee穿挨,所以虛擬機(jī)實(shí)際上執(zhí)行了兩天指令:

  • 1.調(diào)用Couple.getWife()方法。
  • 2.將Object轉(zhuǎn)換成Employee類型肴盏。

3.翻譯泛型方法

public static <T extends Comparable<T>> max(T[] arrays) {... }  
擦除后成了:  
public static Comoparable max(Comparable[] arrays) {... }  
public class Period <T extends Comparable<T> & Serializable> {  
      private T begin;  
      private T end;  
  
      public Period(T one, T two) {  
               if (one.compareTo(two) > 0) {begin = two;end = one;  
              } else {begin = one;end = two;}  
     }  
     public void setBegin(T begin) {this. begin = begin;}  
     public void setEnd(T end) {this. end = end;}  
     public T getBegin() {return begin;}  
     public T getEnd() {return end;}  
}  
public class DateInterval extends Period<Date> {  
  
      public DateInterval(Date one, Date two) {  
               super(one, two);  
     }  
      public void setBegin(Date begin) {  
               super.setBegin(begin);  
     }  
}  

DateInterval類型擦除后科盛,Period中的方法變成:

  • public void setBegin(Object begin) {...}

而DateInterval中的方法還是:

  • public void setBegin(Date begin) {...}

所以DateInterval從Period中繼承了 public void setBegin(Object begin) {...}而自身又存在public void setBegin(Date begin) {...}方法,用戶使用時(shí)問(wèn)題發(fā)生了:

Period<Date> period  = new DateInterval(...);  
period.setBegin(new Date());  

這里因?yàn)閜eriod引用指向了DateInterval實(shí)例菜皂,根據(jù)多態(tài)性贞绵,setBegin應(yīng)該調(diào)用DateInterval對(duì)象的setBegin方法,可是這個(gè)擦除讓Period中的 public void setBegin(Object begin) {...}被調(diào)用恍飘,導(dǎo)致了擦除與多態(tài)發(fā)生了沖突榨崩,怎么辦呢?虛擬機(jī)此時(shí)會(huì)在DateInterval類中生成一個(gè)橋方法(bridge method)章母,調(diào)用過(guò)程發(fā)生了細(xì)微的變化:

public void setBegin(Object begin) {  
     setBegin((Date)begin);  
 }  

有了這個(gè)合成的橋方法以后母蛛,code07中對(duì)setBegin的調(diào)用步驟如下:

1.調(diào)用DateInterval.setBegin(Object)方法。
2.DateInterval.setBegin(Object)方法調(diào)用DateInterval.setBegin(Date)方法乳怎。

發(fā)現(xiàn)了嗎彩郊,當(dāng)我們?cè)贒ateInterval中增加了getBegin方法之后會(huì)是什么樣子的呢?是不是Peroid中有一個(gè)Object getBegin()的方法,而DateInterval中有一個(gè)Date getBegin()方法呢秫逝,這兩個(gè)方法在Java中是不能同時(shí)存在的恕出,可是Java5以后增加了一個(gè)協(xié)變類型,使得這里是被允許的筷登,看看DateInterval中g(shù)etBegin方法就知道了:

@Override  
public Date getBegin(){ return super.getBegin(); }  

這里用了@Override剃根,說(shuō)明是覆蓋了父類的Object getBegin()方法,而返回值可以指定為父類中的返回值類型的子類前方,這就是協(xié)變類型狈醉,這是Java5以后才可以允許的,允許子類覆蓋了方法后指定一個(gè)更嚴(yán)格的類型(子類型)惠险。

總結(jié):

  • 1.記住一點(diǎn)苗傅,虛擬機(jī)中沒(méi)有泛型,只有普通的類班巩。
  • 2.所有泛型的類型參數(shù)都用它們限定的類型代替渣慕,沒(méi)有限定則用Object。
  • 3.為了保持類型安全性抱慌,虛擬機(jī)在有必要時(shí)插入強(qiáng)制類型轉(zhuǎn)換逊桦。
  • 4.橋方法的合成用來(lái)保持多態(tài)性。
  • 5.協(xié)變類型允許子類覆蓋方法后返回一個(gè)更嚴(yán)格的類型抑进。

六强经、約束和局限性

1.不能使用基本類型實(shí)例化泛型

不能使用基本類型作為類型參數(shù),因?yàn)椴脸笏律赡軙?huì)是Object類型匿情,Object類型是無(wú)法存儲(chǔ)基本類型的

2.運(yùn)行時(shí)類型檢查只適用于原始類型

  • 使用getClass會(huì)返回一個(gè)原始類型,比如Object信殊;
  • 使用instanceof和強(qiáng)制轉(zhuǎn)換都會(huì)出現(xiàn)錯(cuò)誤和警告炬称。
if(a instanceof Pari<String>) //Error
Pair<String> p = (Pair<String>) a;//Error

Pair<Employee> employee = ...
Pair<String> stringPari = ...
if(employee.getClasss()==stringPari.getClass())//返回true

3.不能創(chuàng)建參數(shù)化類型數(shù)組

不能實(shí)例化參數(shù)化類型數(shù)組,可以聲明變量:Pari<String>[] table,只是不能new涡拘,這樣做是為了保證數(shù)組的安全玲躯,因?yàn)樵陬愋筒脸臅r(shí)候會(huì)變?yōu)镺bject,防止數(shù)組可以add任何元素進(jìn)去鳄乏。

Pair<String>[] table = new Pair<String>[10];//Error

4.不能實(shí)例化類型變量

類型擦除會(huì)將T修改為Object府蔗,而new Object()是不被允許的,可以通過(guò)反射來(lái)實(shí)例化一個(gè)泛型對(duì)象汞窗。

public Pair(){
    first = new T();
    second = new T();
}

5.不能構(gòu)造泛型數(shù)組

因?yàn)轭愋筒脸辉试S實(shí)例化一個(gè)泛型數(shù)組赡译,防止add的時(shí)候出現(xiàn)ArrayStoreException仲吏。

public static <T extends Comparable >T[] minmax(T[] a){ //Error
    T[] mm = new T[2];
    ...
}

如果想實(shí)例化泛型數(shù)組,可以通過(guò)以下方法來(lái)解決:

  • 通過(guò)反射來(lái)解決
public static <T extends Comparable> T[] minmax(T ... t){
    T[] mm = (T[]) Array.newInstance(a.getClass().getComponentType(),2);
}

七、通配符類型

通配符類型中裹唆,允許參數(shù)類型變化誓斥,前面的 ? extends X,可以讓編譯器知道只需要某個(gè)X的子類型,拒絕傳遞其他特定類型许帐。

1.通配符超類型限定

表示類型的下界劳坑,格式是:? super X成畦。

特點(diǎn):

1距芬、限定為X和X的超類型,直至Object類循帐,因?yàn)椴恢谰唧w是哪個(gè)超類型框仔,因此方法返回的類型只能賦給Object。

2拄养、因?yàn)榭梢韵蛏限D(zhuǎn)型离斩,所以作為方法的參數(shù)時(shí),可以傳遞X以及X的超類型瘪匿。

3跛梗、作為方法的參數(shù)時(shí),可以傳遞null棋弥。

作用:主要用來(lái)安全地寫入數(shù)據(jù)核偿,可以寫入X及其超類型。

/** 
 * ICE 
 * 2016/10/17 0017 14:12 
 */  
public class Demo {  
    public static void main(String[] args) {  
        A a = new A();  
        B b = new B();  
        C c = new C();  
  
        D<? super A> d = new D<>();  
        Object o = d.get();  
  
        d.set(a);  
        d.set(b);  
        d.set(c);  
        d.set(null);  
    }  
}  
  
class A {  
    @Override  
    public String toString() {  
        return "A{}";  
    }  
}  
  
class B extends A {  
    @Override  
    public String toString() {  
        return "B{}";  
    }  
}  
  
class C extends A {  
    @Override  
    public String toString() {  
        return "C{}";  
    }  
}  
  
class D<T> {  
    public void set(T t) {  
    }  
  
    public T get() {  
        return null;  
    }  
} 

2.無(wú)限制

無(wú)限定不等于可以傳任何值嘁锯,相反宪祥,作為方法的參數(shù)時(shí),只能傳遞null家乘,作為方法的返回時(shí)蝗羊,只能賦給Object。

public class Demo {  
    public static void main(String[] args) {  
        D<?> d = new D<>();  
        Object o = d.get();  
        d.set(null);  
    }  
}  
  
class A {  
    @Override  
    public String toString() {  
        return "A{}";  
    }  
}  
  
class B extends A {  
    @Override  
    public String toString() {  
        return "B{}";  
    }  
}  
  
class C extends A {  
    @Override  
    public String toString() {  
        return "C{}";  
    }  
}  
  
class D<T> {  
    public void set(T t) {  
    }  
  
    public T get() {  
        return null;  
    }  
}  

有什么作用呢仁锯?對(duì)于一些簡(jiǎn)單的操作比如不需要實(shí)際類型的方法耀找,就顯得比泛型方法簡(jiǎn)潔,可以這樣說(shuō):如果是“讀”操作 則需要限定 上邊界业崖,如果是寫操作則需要限定下邊界野芒;而無(wú)限定通配符表示只讀,不能進(jìn)行增加双炕、修改狞悲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末著榴,一起剝皮案震驚了整個(gè)濱河市呈宇,隨后出現(xiàn)的幾起案子醉箕,更是在濱河造成了極大的恐慌,老刑警劉巖席舍,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买置,死亡現(xiàn)場(chǎng)離奇詭異榆浓,居然都是意外死亡菩混,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門融求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咬像,“玉大人,你說(shuō)我怎么就攤上這事生宛∠匕海” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵茅糜,是天一觀的道長(zhǎng)七芭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蔑赘,這世上最難降的妖魔是什么狸驳? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缩赛,結(jié)果婚禮上耙箍,老公的妹妹穿的比我還像新娘。我一直安慰自己酥馍,他們只是感情好辩昆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旨袒,像睡著了一般汁针。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砚尽,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天施无,我揣著相機(jī)與錄音,去河邊找鬼必孤。 笑死猾骡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敷搪。 我是一名探鬼主播兴想,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赡勘!你這毒婦竟也來(lái)了嫂便?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闸与,失蹤者是張志新(化名)和其女友劉穎顽悼,沒(méi)想到半個(gè)月后曼振,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔚龙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了映胁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片木羹。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖解孙,靈堂內(nèi)的尸體忽然破棺而出坑填,到底是詐尸還是另有隱情,我是刑警寧澤弛姜,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布脐瑰,位于F島的核電站,受9級(jí)特大地震影響廷臼,放射性物質(zhì)發(fā)生泄漏苍在。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一荠商、第九天 我趴在偏房一處隱蔽的房頂上張望寂恬。 院中可真熱鬧,春花似錦莱没、人聲如沸初肉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牙咏。三九已至,卻和暖如春嘹裂,著一層夾襖步出監(jiān)牢的瞬間妄壶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工焦蘑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盯拱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓例嘱,卻偏偏與公主長(zhǎng)得像狡逢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拼卵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 引言:泛型一直是困擾自己的一個(gè)難題奢浑,但是泛型有時(shí)一個(gè)面試時(shí)老生常談的問(wèn)題;今天作者就通過(guò)查閱相關(guān)資料簡(jiǎn)單談?wù)勛约簩?duì)...
    cp_insist閱讀 1,843評(píng)論 0 4
  • 泛型是Java 1.5引入的新特性腋腮。泛型的本質(zhì)是參數(shù)化類型雀彼,這種參數(shù)類型可以用在類壤蚜、變量、接口和方法的創(chuàng)建中徊哑,分別...
    何時(shí)不晚閱讀 3,035評(píng)論 0 2
  • object 變量可指向任何類的實(shí)例袜刷,這讓你能夠創(chuàng)建可對(duì)任何數(shù)據(jù)類型進(jìn)程處理的類。然而莺丑,這種方法存在幾個(gè)嚴(yán)重的問(wèn)題...
    CarlDonitz閱讀 913評(píng)論 0 5
  • Why ——引入泛型機(jī)制的原因 假如我們想要實(shí)現(xiàn)一個(gè)String數(shù)組著蟹,并且要求它可以動(dòng)態(tài)改變大小,這時(shí)我們都會(huì)想到...
    absfree閱讀 5,110評(píng)論 1 6
  • 泛型的好處 使用泛型的好處我覺(jué)得有兩點(diǎn):1:類型安全 2:減少類型強(qiáng)轉(zhuǎn) 下面通過(guò)一個(gè)例子說(shuō)明: 假設(shè)有一個(gè)Tes...
    德彪閱讀 1,122評(píng)論 0 0