概述
- 泛型可以解決數據類型的安全性問題。原理:在類聲明的時候通過一個標識表示類中某個屬性的類型或者是某個方法的返回值及參數類型
- 泛型是在JDK1.5 之後增加的新功能
格式
1.泛型類
訪問權限 class 類名稱<泛型,泛型...>{
屬性
方法
}
public class GenericDemo0<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public static void main(String args[]) {
GenericDemo0<Integer> i = new GenericDemo0<>();
i.setT(1);
System.out.println("-----泛型類--->" + i.getT());
GenericDemo0<String> str = new GenericDemo0<>();
str.setT("泛型類");
System.out.println(str.getT());
}
}
在類名後面添加了類型參數聲明部分.
泛型類的類型參數聲明部分包含一個或多個類型參數,參數間用逗號隔開
一個泛型參數,被稱爲一個類型變量,是用於指定一個泛型類型名稱的標識符
對象的創建: 類名稱<具體類型> 對象名稱=new 類名稱<具體類型>()
2.泛型接口
interface 接口名稱<泛型標識>{}
interface Gen<T> {
T call(T t);
}
在接口名稱後面加上 < T >
3.泛型方法
訪問權限 <泛型標識> 返回類型 方法名稱 ([泛型標識 參數名稱])
private static <T> void call(T t) {
System.out.println("---泛型方法-->" + t);
}
private static <E> E[] generCall(E[] array) {
System.out.println("---泛型方法-->" + Arrays.toString(array));
return array;
}
所有泛型方法聲明都有一個類型參數聲明部分(由尖括號分隔),該類型參數聲明部分在方法返回類型之前
類型參數能被用來聲明返回值類型,並且能作爲泛型方法得到的實際參數類型的佔位符
注意類型參數只能代表引用型類型,不能是原始類型
類型通配符
上界通配符
? extends 叫做上界通配符,使 Java 泛型具有協變性。extends 限制了泛型類型的父類型,所以叫上界
List<? extends TextView> textViews = new ArrayList<TextView>(); // 本身
List<? extends TextView> textViews = new ArrayList<Button>(); // 直接子類
List<? extends TextView> textViews = new ArrayList<RadioButton>(); // 間接子類
- 其中 ? 是個通配符,表示這個 List 的泛型類型是一個未知類型
- extends 限制了這個未知類型的上界,也就是泛型類型必須滿足這個 extends 的限制條件:它的範圍不僅是所有直接和間接子類,還包括上界定義的父類本身,也就是 TextView;它還有 implements 的意思,即這裏的上界也可以是 interface。
下界通配符
? super 叫做下界通配符,使 Java 泛型具有逆變性。 super 限制了通配符 ? 的子類型,所以稱之爲下界。
List<? super Button> buttons = new ArrayList<Button>(); // 本身
List<? super Button> buttons = new ArrayList<TextView>(); // 直接父類
List<? super Button> buttons = new ArrayList<Object>(); // 間接父類
- 通配符 ? 表示 List 的泛型類型是一個未知類型
- super 限制了這個未知類型的下界,也就是泛型類型必須滿足這個 super 的限制條件。super 我們在類的方法裏面經常用到,這裏的範圍不僅包括 Button 的直接和間接父類,也包括下界 Button 本身。super 同樣支持 interface
小結
Java 的泛型本身是不支持協變和逆變的,Java 的泛型類型會在編譯時發生類型擦除
- 可以使用泛型通配符 ? extends 來使泛型支持協變
- 可以使用泛型通配符 ? super 來使泛型支持逆變