泛型
Java泛型是jdk1.5的一個新特性,jdk的性特性還包括:泛型,枚舉,裝箱和拆箱,可變參數等。這里先主要學習泛型。這些特性,現在都在廣泛的使用。因為現在使用IDE編寫代碼,都是標準的代碼提示,所以泛型也就變得理所應當,但還是應該學習記錄一下。
泛型的聲明
interface List和class 名稱<K,V>,其中T,K,V代表的是類型。例如 List list = new ArrayList(); Inerator iterator = customers.iterator();
說明:T只能是類,不能是基本數據類型
為什么要有這個新特性
public static void main(String[] args) {List list = new ArrayList();list.add(12);list.add(23);list.add(45);list.add(65);list.add(new String("AA"));for(int i = 0 ; i < list.size(); i++){int age = (Integer)list.get(i);System.out.println(age);}
}
復制代碼
上述代碼就是用一個集合存儲年齡,如果不使用泛型的話就是任何元素就都可添加到集合中,導致類型不安全,其次在遍歷的時候需要強轉,如果不小心在Integer類型的集合中放入一個String類型的,那么在遍歷就會出現一個類型轉換異常。 1.為了解決元素存儲的安全性問題 2.解決獲取數據元素時,需要類型強轉的問題,例如 String類型的對象→集合Object類型對象→讀取為Object對象→強轉為String對象,集合使用Object類型會導致類型不安全,簡單說就是任何元素都可以添加進去。
使用泛型
集合中使用泛型可以達到類型安全,讀取出來的對象不需要強轉,使得程序簡單快捷。 同上的代碼,如果集合的聲明為:
List<String> list = new ArrayList<String>();
復制代碼
使用泛型聲明集合,就只能向集合添加相同類型的數據,在遍歷的數據類型也是聲明泛型的類型,不需要再強轉。下面是使用泛型的一個例子。
public static void main(String[] args) {Map<String, Integer> map = new HashMap<String, Integer>();map.put("AA", 98);map.put("BB", 86);map.put("CC", 75);map.put("DD", 62);Set<Map.Entry<String, Integer>> set = map.entrySet();for(Map.Entry<String, Integer> o: set){System.out.println(o.getKey()+"===="+o.getValue());}
}
復制代碼
List源碼解釋泛型
1.為什么List接口可以使用泛型,源碼如下:
public interface List<E> extends Collection<E> {
復制代碼
其中代表的就是泛型,再看里面的方法,
boolean add(E e);E get(int index);
復制代碼
其中的方法都是傳入泛型的對象,得到的也是泛型的對象。
自定義泛型類,泛型方法
當實例化泛型類的對象時,明確指明泛型的類型,自定義泛型類的類中所有使用泛型的位置,都變成實例化中指定的泛型的類型。例如如下自定義泛型類:
public class TestGeneric<T> {private String name;private String sex;private T t;List<T> list = new ArrayList<>();public void add(){list.add(t);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public T getT() {return t;}public void setT(T t) {this.t = t;}public static void main(String[] args) {TestGeneric<String> generic = new TestGeneric<String>();generic.setT("AA");generic.add();List<String> list = generic.list;System.out.println(list);}
}
復制代碼
泛型的更多使用是為了代碼的通用性。在使用jdbc編寫查詢數據的DAO就可以使用泛型來編寫通用的父類DAO。讓子類繼承來決定類型。 對于集合類的泛型需要注意以下幾點: