針對泛型的一些想法和思考

泛型是在java1.5後新加入的東西,這塊內容使得java的封裝性能更加強大,使用的時候也更加方便。但是這塊內容又是比較難以理解的,基於此做此文記錄自己的學習心得。

泛型,具體的來說就是將java中操作的數據類型"參數化",使得我們在使用的時候可以把數據類型當成是一個參數,像普通的方式似的進行操作。這些應用很廣泛,這種參數類型可以使用在類、接口以及方法定義中。

明確一下幾點:

1.爲什麼使用泛型?

沒有泛型的時候,我們通過object對象對多種數據類型就行轉換和操作,多數爲強制類型轉換。但是,這個前提是開發者對於自己的方法中定義的數據類型是確定的情況下的。假若使用同一項目組的其他成員的方法就可能出現對於數據類型不正確或者不明確的情況,這時候就會有運行報錯,但是一般不會有編譯錯誤。而有泛型的時候是:使用泛型的好處在於,它在編譯的時候進行類型安全檢查,並且在運行時所有的轉換都是強制的,隱式的,大大提高了代碼的重用率。

2.簡單的使用場景。

public class getFloat {
   private Float testfoalt;
public Float getTestfoalt() {
return testfoalt;
}
public void setTestfoalt(Float testfoalt) {
this.testfoalt = testfoalt;
}
}

public class getDouble {
   private Double testdouble;
public Double getTestdouble() {
return testdouble;
}
public void setTestdouble(Double testdouble) {
this.testdouble = testdouble;
}
}

使用泛型後代碼可以簡介的寫爲:

public class getDouble<T> {
private T myobj;
public T getMyobj() {
return myobj;
}
public void setMyobj(T myobj) {
this.myobj = myobj;
}
}

調用方法:

getDouble<String> myobj=new getDouble<String>();
myobj.setMyobj("hello world");

2.1、<T>是泛型的標記,當然可以使用別的名字,比如。使用<T>聲明一個泛型的引用,從而可以在class、方法及接口中使用它進行數據定義,參數傳遞。

2.2、<T>在聲明的時候相當於一個有意義的數據類型,編譯過程中不會發生錯誤;在實例化時,將其用一個具體的數據類型進行替代,從而就可以滿足不用需求。

3.規則和使用注意事項:

3.1、泛型的參數類型只能是引用類型,而不能是簡單類型。

      比如,<int>是不可使用的。

3.2、可以聲明多個泛型參數類型,比如<T, P,Q…>,同時還可以嵌套泛型,例如:<List<String>>

3.3、泛型的參數類型可以使用extends語句,例如<T extends superclass>。

3.4、泛型的參數類型可以使用super語句,例如< T super childclass>。

3.5、泛型還可以使用通配符,例如<? extends ArrayList>

4.擴展功能的注意事項

4.1、extends語句

使用extends語句將限制泛型參數的適用範圍。例如:

<T extends collection> ,則表示該泛型參數的使用範圍是所有實現了collection接口的calss。如果傳入一個<String>則程序編譯出錯。

4.2、super語句

super語句的作用與extends一樣,都是限制泛型參數的適用範圍。區別在於,super是限制泛型參數只能是指定該class的上層父類。

例如<T super List>,表示該泛型參數只能是List和List的上層父類。

4.3、通配符

使用通配符的目的是爲了解決泛型參數被限制死了不能動態根據實例來確定的缺點。

舉個例子:public class SampleClass < T extends S> {…}

假如A,B,C,…Z這26個class都實現了S接口。我們使用時需要使用到這26個class類型的泛型參數。那實例化的時候怎麼辦呢?依次寫下

SampleClass<A> a = new SampleClass();

SampleClass<B> a = new SampleClass();

SampleClass<Z> a = new SampleClass();

這顯然很冗餘,還不如使用Object而不使用泛型,呵呵,是吧?

彆着急,咱們使用通配符,就OK了。

SampleClass<? Extends S> sc = new SampleClass();


感謝點滴在心頭大大對於部分例子的借鑑。
發佈了16 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章