Java 泛型
1.什麼是Java中的泛型
泛型是Java5.0後出現的一個新特性,又稱參數化類型,也就是將類型當作參數,傳遞給類,接口,方法。
【對比】 形式 應用場合 備註
普通的參數 傳遞的是值 只能用在方法中 要求形參和實參必須一致
泛型參數 傳遞的是類型 可以用在類、方法或接口中 可以不用傳參,默認是Object類型
2.泛型的好處
-
編譯時檢查類型,提高安全性;
-
減少類型轉換次數,提高軟件運行效率;
沒有使用泛型:
向上轉型 向下轉型
String————————>Object————————>String
使用泛型:String————————>String————————>String
3.泛型的語法
語法 *
List<XX> list = new ArrayList<XX>(); 全類型的寫法
List<XX> list = new ArrayList<>();//jdk7.0新特性 通過類型推斷可以省略後面的類型,建議這樣寫
注意:
- XX只能是類或引用數據類型 ,不能是基本數據類型;
- 前後類型必須一致;
- 帶泛型的類如果不指定類型,則默認爲Object類型;
4.自定義泛型
4.1自定義泛型類
語法:
class MyGeneric<T,U>{
T t;
U u;
}
可以定義一個泛型或多個泛型
注意:
1、裏面可以有任意普通成員和 使用泛型的成員
2、不能有使用泛型的靜態成員和泛型數組初始化
使用:
①創建對象
MyGeneric<String,Integer> m = new MyGeneric<>();
②繼承該類
class Sub extends MyGeneric<String,Integer>{}
注意:如果子類聲明時依然不能確定父類的泛型,則可以繼續定義成泛型類
eg:
class Sub<T> extends MyGeneric<T, Integer>{} 裏面的第一個泛型 在子類中不確定,子類可以繼續使用泛型;
4.2自定義泛型接口
語法:
interface MyGenericInt<T>{}
注意:
泛型可以使用在抽象方法或默認方法中,可以當做參數也可以當做返回類型!
使用:
泛型接口確定的時期:
①繼承該接口
public interface MyGenericSub implements MyGenericInt<Interger>{} 確定泛型爲Integer
②實現該接口
public Class MyGenericClass implements MyGenericInt<Interger>{} 確定泛型爲Integer
注意:如果子接口或實現類依然不能接口的泛型,則可以繼續定義成泛型類或 泛型接口
eg:
public interface MyGenericSub<T> implements MyGenericInt<T>{} 泛型不確定,在子接口中繼續使用泛型;
4.3自定義泛型方法
語法:
方法必須定義在類體或接口中!
說明:泛型方法可以定義在普通類或接口中,以及泛型類或泛型接口中!
語法:
public<T,U,R> void method(T t,U u,R r) {
}
注意:如果泛型方法用在泛型類或泛型接口時,最好泛型標記區分開,提高代碼的閱讀性
使用:
在方法被調用的時候確定泛型方法的類型,當方法被調用的時候,實參的類型就是對應的泛型類型。
5.Java泛型中的通配符
- 泛型不具備繼承性
List<Map> list = new ArrayList<HashMap>(){} 兩邊的泛型 一個爲Map 一個爲HashMap,這樣是錯誤的;
- 泛型通配符 (通配符是在使用泛型類或者泛型接口時使用)
?:任意泛型類型。只能讀取,不能添加。除了null
Collectin<?> col = new ArrayList<>();
demo:
pulic void printCollection(Collection<?> col){
//獲取迭代器
Iterator<?> iterator = clo.iterator();
//循環打印
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
//此方法可以傳入存儲任意類型數據的Collection接口的實現進行迭代,但是隻能讀取,不能添加。
? extends XX:支持XX類型和其子類類型。相當於規定了泛型的上限。只能讀取,不能添加。除了null
Collectin<? extends XXX> col = new ArrayList<>();
? super XX:支持XX類型和其父類類型。相當於規定了泛型的下限。只能讀取,不能添加。除了XX類型和null
Collectin<? super XXX> col = new ArrayList<>();