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>();
本人寫作功底不行,請見諒。
下一文:關於泛型的實際使用及使用中遇到的問題