大三筆記(泛型小記)
阿新 • • 發佈:2018-11-09
泛型方法
泛型類,是在例項化類的時候指明泛型的具體型別;泛型方法,是在呼叫方法的時候指明泛型的具體型別 。
/** * 泛型方法的基本介紹 * @param tClass 傳入的泛型實參 * @return T 返回值為T型別 * 說明: * 1)public 與 返回值中間<T>非常重要,可以理解為宣告此方法為泛型方法。 * 2)只有聲明瞭<T>的方法才是泛型方法,泛型類中的使用了泛型的成員方法並不是泛型方法。 * 3)<T>表明該方法將使用泛型型別T,此時才可以在方法中使用泛型型別T。 * 4)與泛型類的定義一樣,此處T可以隨便寫為任意標識,常見的如T、E、K、V等形式的引數常用於表示泛型。 */ public <T> T genericMethod(Class<T> tClass)throws InstantiationException , IllegalAccessException{ T instance = tClass.newInstance(); return instance; }
注意第二點,只有聲明瞭<T>的方法才是泛型方法,泛型類中的使用了泛型的成員方法並不是泛型方法。
當然第一點也是基礎而重要的,public 與 返回值中間<T>非常重要,可以理解為宣告此方法為泛型方法。
也就是說該方法的返回值型別是<T>後面的T型別,前面的<T>只是將該方法宣告為泛型方法,而不是指定該方法的返回值型別。
基於上面所說。
public void showKeyValue1(Generic<Number> obj){ Log.d("泛型測試","key value is " + obj.getKey()); } //這也不是一個泛型方法,這也是一個普通的方法,只不過使用了泛型萬用字元? //同時這也印證了泛型萬用字元章節所描述的,?是一種型別實參,可以看做為Number等所有類的父類 public void showKeyValue2(Generic<?> obj){ Log.d("泛型測試","key value is " + obj.getKey()); } /** * 這個方法是有問題的,編譯器會為我們提示錯誤資訊:"UnKnown class 'E' " * 雖然我們聲明瞭<T>,也表明了這是一個可以處理泛型的型別的泛型方法。 * 但是隻聲明瞭泛型型別T,並未宣告泛型型別E,因此編譯器並不知道該如何處理E這個型別。 public <T> T showKeyName(Generic<E> container){ ... } */
上面三個方法均不是泛型方法。
/** * 這才是一個真正的泛型方法 * 首先在public與返回值之間的<T>必不可少,這表明這是一個泛型方法,並且聲明瞭一個泛型T * 這個T可以出現在這個泛型方法的任意位置. * 泛型的數量也可以為任意多個 * 如:public <T,K> K showKeyName(Generic<T> container){ * ... * } */ public <T> T showKeyName(Generic<T> container){ System.out.println("container key :" + container.getKey()); //當然這個例子舉的不太合適,只是為了說明泛型方法的特性。 T test = container.getKey(); return test; }
這才是一個真正的泛型方法。