Java泛型

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<>();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章