Java泛型的學習筆記[1]—基礎知識

泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定爲一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱爲泛型類、泛型接口、泛型方法。本文主要描述的是泛型類

   Java語言引入泛型的好處:1)最大程度的保證了類型安全;2)簡化編譯

   我們以ArrayList類爲例:

   1)如果沒有泛型,我們要不然需要爲每一種類型X編寫一個XArrayList類;要不然在ArrayList中用Object的對象來存儲數據,然後每次取出對象時使用類型轉換;

           2)而我們使用了泛型方式來定義ArrayList:public class ArrayList<T>{}  ,既保證了每次使用ArrayList時的類型安全,又簡化了實現ArrayList的編程工作。

   好了,下面我們還是先拋出泛型類的概念和特性:

基礎概念:

   泛型類實際就是一個帶參數的類。泛型類定義可以有多個泛型參數,中間用逗號隔開。泛型的概念也存在於C++和C#語言中。如同如下代碼:

public class MyList<T> {
	private List<T> list=new ArrayList<T>();
	public T get(int index){
		return list.get(index);
	}
	//此處省略了若干內容....
}

受限制的泛型類定義:
  假設我們定義了以下三個類:

   

  現在我就想專門針對上述三個類編寫一個List類,則如下代碼如示:

public class MyList<T extends Animal> {
	private List<T> list=new ArrayList<T>();
	public T get(int index){
		return list.get(index);
	}
	//此處省略了若干內容....
}

 

  如此的話,就可以將MyList的類參數的使用限制在Animal及其子類了。如果違反這個規則,編譯期就會報錯的。這樣,就很大程度上保證了類型安全。

  MyList<Object> list=null;//編譯出錯

通配符泛型:
  有時在使用泛型類時,遇到不太確定參數的類型,可以用?代替。尤其是在做Java反射時:

  Class<?> clazz=Class.forName(className);

  受限制的通配符類型:但有時,你雖然不能確定類參數的具體類型,但是你能確定它大概的類型,比如該參數類型是Animal或者是其子類。

  此時可以這樣用:Class<? extends Animal> clazz=Class.forName(className);

       需要注意的是:通配符不僅可以向下限制[通配符代表某類型或某類型的子類],還可以向上限制[通配符代表某類型或是某類型的父類]

  比如:Class<? super Cat>  clazz=Class.forName(className);//表示?代表的是Cat或Cat的基類Animal

  當然,還有一些其它的例子來描述通配符:

  比如定義一個變量:List<? extends Animal> animals=new ArrayList<Cat>();

      本人寫作功底不行,請見諒。

  下一文:關於泛型的實際使用及使用中遇到的問題

發佈了30 篇原創文章 · 獲贊 34 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章