1、沒有任何重構(gòu)的原始代碼                
                    有兩個(gè)類如下,要構(gòu)造兩個(gè)類的對(duì)象,并打印出各自的成員x。                
                    public class StringFoo {                
                    private String x;                
                    public StringFoo(String x) {                
                    this.x = x;                
                    }                
                    public String getX() {                
                    return x;                
                    }                
                    public void setX(String x) {                
                    this.x = x;                
                    }                
                    }                
                    public class DoubleFoo {                
                    private Double x;                
                    public DoubleFoo(Double x) {                
                    this.x = x;                
                    }                
                    public Double getX() {                
                    return x;                
                    }                
                    public void setX(Double x) {                
                    this.x = x;                
                    }                
                    }                
                    以上的代碼實(shí)在無聊,就不寫如何實(shí)現(xiàn)了。                
                    2、對(duì)上面的兩個(gè)類進(jìn)行重構(gòu),寫成一個(gè)類                
                    因?yàn)樯厦娴念愔?,成員和方法的邏輯都一樣,就是類型不一樣,因此考慮重構(gòu)。Object是所有類的父類,因此可以考慮用Object做為成員類型,這樣就可以實(shí)現(xiàn)通用了,實(shí)際上就是“Object泛型”,暫時(shí)這么稱呼。                
                    public class ObjectFoo {                
                    private Object x;                
                    public ObjectFoo(Object x) {                
                    this.x = x;                
                    }                
                    public Object getX() {                
                    return x;                
                    }                
                    public void setX(Object x) {                
                    this.x = x;                
                    }                
                    }                
                    寫出Demo方法如下:                
                    public class ObjectFooDemo {                
                    public static void main(String args[]) {                
                    ObjectFoo strFoo = new ObjectFoo(new StringFoo('Hello Generics!'));                
                    ObjectFoo douFoo = new ObjectFoo(new DoubleFoo(Double('33')));                
                    ObjectFoo objFoo = new ObjectFoo(new Object());                
                    System.out.println('strFoo.getX='+(StringFoo)strFoo.getX());                
                    System.out.println('douFoo.getX='+(DoubleFoo)douFoo.getX());                
                    System.out.println('objFoo.getX='+objFoo.getX());                
                    }                
                    }                
                    運(yùn)行結(jié)果如下:                
                    strFoo.getX=Hello Generics!                
                    douFoo.getX=33.0                
                    objFoo.getX=java.lang.Object@19821f                
                    解說:在Java 5之前,為了讓類有通用性,往往將參數(shù)類型、返回類型設(shè)置為Object類型,當(dāng)獲取這些返回類型來使用時(shí)候,必須將其“強(qiáng)制”轉(zhuǎn)換為原有的類型或者接口,然后才可以調(diào)用對(duì)象上的方法。                
                    3、Java1.5泛型來實(shí)現(xiàn)                
                    強(qiáng)制類型轉(zhuǎn)換很麻煩,我還要事先知道各個(gè)Object具體類型是什么,才能做出正確轉(zhuǎn)換。否則,要是轉(zhuǎn)換的類型不對(duì),比如將“Hello Generics!”字符串強(qiáng)制轉(zhuǎn)換為Double,那么編譯的時(shí)候不會(huì)報(bào)錯(cuò),可是運(yùn)行的時(shí)候就掛了。那有沒有不強(qiáng)制轉(zhuǎn)換的辦法----有,改用 Java5泛型來實(shí)現(xiàn)。                
                    public class GenericsFoo {                
                    private T x;                
                    public GenericsFoo(T x) {                
                    this.x = x;                
                    }                
                    public T getX() {                
                    return x;                
                    }                
                    public void setX(T x) {                
                    this.x = x;                
                    }                
                    }                
                    public class GenericsFooDemo {                
                    public static void main(String args[]){                
                    GenericsFoo strFoo=new GenericsFoo('Hello Generics!');                
                    GenericsFoo douFoo=new GenericsFoo(new Double('33'));                
                    GenericsFoo                
                    System.out.println('strFoo.getX='+strFoo.getX());                
                    System.out.println('douFoo.getX='+douFoo.getX());                
                    System.out.println('objFoo.getX='+objFoo.getX());                
                    }                
                    }                
                    運(yùn)行結(jié)果:                
                    strFoo.getX=Hello Generics!                
                    douFoo.getX=33.0                
                    objFoo.getX=java.lang.Object@19821f                
                    和使用“Object泛型”方式實(shí)現(xiàn)結(jié)果的完全一樣,但是這個(gè)Demo簡(jiǎn)單多了,里面沒有強(qiáng)制類型轉(zhuǎn)換信息。                
                    下面解釋一下上面泛型類的語(yǔ)法:                
                    使用來聲明一個(gè)類型持有者名稱,然后就可以把T當(dāng)作一個(gè)類型代表來聲明成員、參數(shù)和返回值類型。                
                    當(dāng)然T僅僅是個(gè)名字,這個(gè)名字可以自行定義。                
                    class GenericsFoo 聲明了一個(gè)泛型類,這個(gè)T沒有任何限制,實(shí)際上相當(dāng)于Object類型,實(shí)際上相當(dāng)于 class GenericsFoo。                
                    與Object泛型類相比,使用泛型所定義的類在聲明和構(gòu)造實(shí)例的時(shí)候,可以使用“<實(shí)際類型>”來一并指定泛型類型持有者的真實(shí)類型。類如                
                    GenericsFoo douFoo=new GenericsFoo(new Double('33'));                
                    當(dāng)然,也可以在構(gòu)造對(duì)象的時(shí)候不使用尖括號(hào)指定泛型類型的真實(shí)類型,但是你在使用該對(duì)象的時(shí)候,就需要強(qiáng)制轉(zhuǎn)換了。比如:GenericsFoo douFoo=new GenericsFoo(new Double('33'));                
                    實(shí)際上,當(dāng)構(gòu)造對(duì)象時(shí)不指定類型信息的時(shí)候,默認(rèn)會(huì)使用Object類型,這也是要強(qiáng)制轉(zhuǎn)換的原因。                
實(shí)際類型>