Java中的範型

什麼是範型

泛型,即“參數化類型”。
顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
泛型的本質是爲了參數化類型。也就是說在泛型使用過程中,操作的數據類型被指定爲一個參數,這種參數類型可以用在類、接口和方法中,分別被稱爲泛型類、泛型接口、泛型方法。

泛型類

泛型類型用於類的定義中,被稱爲泛型類。

範型類的寫法

class 類名稱 <泛型標識:可以隨便寫任意標識號,標識指定的泛型的類型>{
  private 泛型標識 /*(成員變量類型)*/ var; 
  .....

  }
}
//此處T可以隨便寫爲任意標識,常見的如T、E、K、V等形式的參數常用於表示泛型
//在實例化泛型類時,必須指定T的具體類型
public class Generic<T>{ 
    //key這個成員變量的類型爲T,T的類型由外部指定  
    private T key;

    public Generic(T key) { //泛型構造方法形參key的類型也爲T,T的類型由外部指定
        this.key = key;
    }

    public T getKey(){ //泛型方法getKey的返回值類型爲T,T的類型由外部指定
        return key;
    }
}

泛型接口

泛型接口與泛型類的定義及使用基本相同。

範型接口的寫法

//定義一個泛型接口
public interface Generator<T> {
    public T next();
}
/**
 * 未傳入泛型實參時,與泛型類的定義相同,在聲明類的時候,需將泛型的聲明也一起加到類中
 * 即:class FruitGenerator<T> implements Generator<T>{
 * 如果不聲明泛型,如:class FruitGenerator implements Generator<T>,編譯器會報錯:"Unknown class"
 */
class FruitGenerator<T> implements Generator<T>{
    @Override
    public T next() {
        return null;
    }
}

泛型方法

泛型方法,是在調用方法的時候指明泛型的具體類型 。

範型方法的寫法

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

 

範型通配符

@Test
    public void testGen(){
        List<String> list = new ArrayList<>();
        list.add("string");
        getData(list);

        List<Integer> list2 = new ArrayList<>();
        list2.add(123);
        getData(list2);
    }

    public static void getData(List<?> data) {
        System.out.println("data :" + data.get(0));
    }

類型通配符一般是使用?代替具體的類型實參,注意了,此處’?’是類型實參,而不是類型形參 。重要說三遍!此處’?’是類型實參,而不是類型形參 ! 此處’?’是類型實參,而不是類型形參 !

可以解決當具體類型不確定的時候,這個通配符就是 ?  ;當操作類型時,不需要使用類型的具體功能時,只使用Object類中的功能。那麼可以用 ? 通配符來表未知類型。

 

泛型上下邊界

要聲明一個有界的類型參數,首先列出類型參數的名稱,後跟extends或super關鍵字,最後緊跟它的上界或下界。由此可以知道泛型的上下邊界的添加必須與泛型的聲明在一起 。

<? extends T> 表示該通配符所代表的類型是T類型的子類。 例如往集合中添加元素時,既可以添加E類型對象,又可以添加E的子類型對象。爲什麼?因爲取的時候,E類型既可以接收E類對象,又可以接收E的子類型對象。

<? super T> 表示該通配符所代表的類型是T類型的父類。例如當從集合中獲取元素進行操作的時候,可以用當前元素的類型接收,也可以用當前元素的父類型接收。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章