1. 程式人生 > >大三筆記(泛型小記)

大三筆記(泛型小記)

 

 

 

泛型方法

泛型類,是在例項化類的時候指明泛型的具體型別;泛型方法,是在呼叫方法的時候指明泛型的具體型別 。

 

/**
 * 泛型方法的基本介紹
 * @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;
    }

這才是一個真正的泛型方法。

 

具體參考:https://blog.csdn.net/s10461/article/details/53941091