談談我眼中的泛型,眼中泛型
很早的時候我就接觸了泛型,但是那個時候並不瞭解泛型有什麼好處,在抽象的過程中使用泛型,後來接觸到了gxpt系統,這個系統架構中,用的是泛型方法.那個時候只是知道這麼用,說是可以解決重複寫代碼的問題,但是我並沒有體會到,後來接觸了Itoo 這個架構,這個裡面用的是泛型類,同時我正在的參與到這個系統中,在跟gxpt相比,我體會到了使用泛型的好處.
一.介紹
泛型是Java SE 1.5的新特性,泛型的本質是參數化型別,也就是說所操作的資料類型被指定為一個參數。這種參數類型可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面、泛型方法。
二.解決問題
在JDK1.5 還沒有泛型的時候,通過使用類型Object的來實現參數的”任意化”.實現參數任意化需要對顯式進行強制類型轉換.而且這種強制轉換要求開發人員對實際參數類型是預知的.對於強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在啟動並執行時候才出現異常,這是一個很大的安全隱患.如果使用泛型,就可以在編譯階段就發現這個錯誤,並且所有的強制轉換都是自動和隱式的,再一次提高了代碼的複用率.總結一句話就是泛型解決抽象過程中需要顯式強制轉換的問題,把主動變成被動,再次提高代碼的複用率.
三.執行個體
無泛型,使用Object+強制轉換實現抽象:
<span style="font-size:18px;">/** * 使用Object 類型,顯示需要強制轉換 * @author huan * */public class NoGen {private Object ob; //定義泛型成員變數public NoGen(Object ob){this.ob=ob;}public Object Getob(){return ob;}public void setOb(Object ob){this.ob=ob;}public void showType(){System.out.println("T的實際類型是:" +ob.getClass().getName());}}public class GenDemo2 {public static void main(String[] args) {//定義泛型類NoGen 的一個Integer版本NoGen intOb=new NoGen(new Integer(88));intOb.showType();int i=(int) intOb.Getob();System.out.println("Value="+i);System.out.println("------------------");//定義泛型類Gen的一個String版本NoGen strOb=new NoGen("Hello Gen!");strOb.showType();String s=(String) strOb.Getob();System.out.println("value="+s);}}</span>
對應類圖:
使用泛型實現抽象:
<span style="font-size:18px;">public class Gen<T> {private T ob; //定義泛型成員變數public Gen(T ob){this.ob=ob;}public T Getob(){return ob;}public void setOb(T ob){this.ob=ob;}public void showType(){System.out.println("T的實際類型是:" +ob.getClass().getName());}}/** * 使用泛型 * @author huan * */public class GenDemo {public static void main(String[] args) {//定義泛型類Gen 的一個Integer版本Gen<Integer> intOb=new Gen<Integer>(88);intOb.showType();int i=intOb.Getob();System.out.println("Value="+i);System.out.println("------------------");//定義泛型類Gen的一個String版本Gen<String> strOb=new Gen<String>("Hello Gen!");strOb.showType();String s=strOb.Getob();System.out.println("value="+s);}}</span>
對應類圖:
從兩張類圖可以看出,Object+強制轉換實現的抽象是被動的,使用泛型事項的抽象是主動的.使用主動替換被動,讓封裝的代碼侵入性更小.
四.泛型類與泛型方法的區別
從範圍來說,泛型類的範圍要比泛型方法要小一些.使用泛型類所受到的限制要大一些.
從載入的情況來看,泛型類延遲了載入時間,屬於懶載入.
五.總結
1.使用泛型,泛型的中的參數是地址傳值還是按值傳遞.
答案:是地址傳值
2.從複用性的角度來說,泛型類和泛型方法那個更好.gxpt運用的是泛型方法,itoo使用的泛型類.itoo使用泛型類是為了把底層進行進一步的封裝.提高代碼的複用率.
3.使用集合的時候都會用上泛型,那麼容器是集合+方法,在容器中,泛型也是常用的。所以學習容器的時候,應該先理解泛型的思想.