淺談java泛型的感化及其根本概念。本站提示廣大學習愛好者:(淺談java泛型的感化及其根本概念)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談java泛型的感化及其根本概念正文
1、泛型的根本概念
java與c#一樣,都存在泛型的概念,及類型的參數化。java中的泛型是在jdk5.0後湧現的,然則java中的泛型與C#中的泛型是有實質差別的,起首從聚集類型下去說,java 中的ArrayList<Integer>和ArrayList<String>是統一個類型,在編譯時會履行類型擦除,及java中的類型是偽泛型,偽泛型將會在前面引見,其次,關於像聚集中添加根本類型的數據時,例如int,會起首將int轉化成Integer對象,即我們平日所說的裝箱操作,在掏出元素的時刻須要將Interger對象轉換成int值類型,即拆箱操作。而在c#中,List<int>和List<string>是分歧的類型,泛型參數在編譯後會是一個占位符,並沒有被擦除,在運轉時被付與正真的類型,它們在體系運轉期生成,有本身的虛辦法表和類型數據,這類完成稱為類型收縮(針對類型收縮,即時編譯器曾經做了許多的優化任務來處理這一成績),這就是所謂的真泛型。與此同時,在對聚集中添加根本元素如int時,不須要裝箱操作,掏出元素時不須要拆箱操作,是以,機能上較java的聚集泛型要好。
java中泛型的引入重要是為懂得決兩個方面的成績:1.聚集類型元素在運轉期湧現類型裝換異常,增長編譯時類型的檢討,2. 處理的時反復代碼的編寫,可以或許復用算法。上面經由過程例子來講明編譯器的類型檢討。
起首我們看一個沒有應用泛型的例子:
ArrayList al = new ArrayList(); al.add("abc"); al.add("124"); al.add("32L");
我們可以向al聚集中添加任何類型的數據。當我們在掏出數據的時刻須要時刻類型轉換,如:
String s = (String)al.get(0); String s1 = (String)al.get(1); //在運轉期,會報錯,類型轉換毛病 Long l = (Long)al.get(2);
由此可以看到,沒有泛型的時刻,削減了編譯時的類型檢討,在掏出元素時須要法式員對每一個元素的類型都懂得,不然極可能在運轉時湧現類型轉換的異常。
那末上面我們經由過程泛型聚集來看看他給我們帶來的利益。
ArrayList<String> al1 = new ArrayList<String>(); al1.add("abc"); al1.add(1); //編譯時報錯,
當我們用String參數類型實例化al1後,我們是不克不及添加int元素的,不然編譯器會報錯,平日在IDE編纂器,如eclipse中會有毛病標識,與此同時,在掏出元素也不須要類型轉換.
string value = al1.get(0); //不須要類型轉換
這就是泛型所帶來的利益。
那末算法的復用重要是表現在,辦法的復用,如ArrayList的Add辦法可使用在任何類型上或限制的類型上。
2、泛型的應用
java中的泛型重要應用在類,辦法,與接口中。起首,我們來簡略的看看在類上的應用:
class Factory<T>{ private T value; public T getValue() { return value; } public void setValue(T v) { this.value = v; } }
添加測試辦法:
Factory<String> f = new Factory<String>(); f.setValue("factory in use"); System.out.println(f.getValue());
泛型接口的應用:
interface MyInterface<T,U>{ void show(T t, U u); } class ShowTest implements MyInterface<String,Integer>{ @Override public void show(String t, Integer u) { System.out.println(t); System.out.println(u); } }
泛型類型參數感化於類上的時刻重要是對多個字段及辦法簽名之間的類型束縛。感化於辦法的時刻重要是對辦法的的多個參數做響應的束縛,在這裡辦法的泛型類型參數不再舉例,上面我們重要引見類型參數的束縛。
3、類型參數束縛
我們看一個小例子,以下代碼所示:
public static <T> T get(T t1,T t2) { if(t1.compareTo(t2)>=0);//編譯毛病 ,the method compareTo(T) is undefined for the type T. return t1; }
可以看到編譯器報錯的信息,關於類型T沒有界說compareTo辦法,在java中類型須要比擬的話須要完成Comparable接口,從而重寫該辦法。 那末我們做以下修正:
public static <T extends Comparable> T get(T t1,T t2) { //添加類型限制 if(t1.compareTo(t2)>=0); return t1; }
經由過程限制T extends Comparable 注解,T是完成了Comparable的接口的類型,是以也完成了compareTo辦法,是以不會發生編譯期毛病。
類型的多個限制時我們可使用&來停止朋分,而且限制的症結詞只能應用extends。與此同時在接口與類型都存在的情形下,類只能放在第一個,而且只能有一個,以下所示:
<T extends Object&Comparable&Serializable>
以上這篇淺談java泛型的感化及其根本概念就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。