什麼是範型
泛型,即“參數化類型”。 顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。 泛型的本質是爲了參數化類型。也就是說在泛型使用過程中,操作的數據類型被指定爲一個參數,這種參數類型可以用在類、接口和方法中,分別被稱爲泛型類、泛型接口、泛型方法。
泛型類
泛型類型用於類的定義中,被稱爲泛型類。
範型類的寫法
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類型的父類。例如當從集合中獲取元素進行操作的時候,可以用當前元素的類型接收,也可以用當前元素的父類型接收。