Java集合中的泛型機制
集合中之是以可以存放不同類型的資料是因為全部當作Object類型處理的,當從集合中取出元素并希望表達該資料最原始的類型時就需要進行強制類型轉換,強制類型轉換不僅使得代碼更加繁瑣而且可能導緻類型轉換異常的發生.
為了避免上述問題的發生,從jdk1.5開始提供泛型機制,也就是在集合名稱的右邊使用<資料類型>的方式明确規定該集合中可以存放的元素類型,若存放其他類型則會報錯,資料類型可以随便寫,可以是java自帶的也可以是我們建立的,但兩邊必須保持一緻。
如:
List<Integer> l1 = new LinkedList<Integer>();
在實際開發過程中,我們可能用到Java多态的機制,左邊放一個Person,那麼右邊Person的子類都可以,如
List<Person> l1 = new LinkedList<Student>();
List<Person> l1 = new LinkedList<Teacher>();
例:用泛型機機制來聲明集合
package com.xxx.xxx
import java.util.LinkedList;
import java.util.List;
import xdl.person.Student;
public class TestListType {
public static void main(String[] args) {
// 使用泛型機制來聲明集合
List<Integer> l1 = new LinkedList<Integer>();
// 表示l1這個集合中隻支援放Integer類型的
// 向集合中添加元素
l1.add(new Integer(1));
l1.add(new Integer(2));
l1.add(new Integer(3));
//l1.add(new String("four")); // 編譯報錯
System.out.println(l1); //[1, 2, 3]
// 擷取集合中下标為0的元素
Integer it = l1.get(0);
System.out.println("it = " + it); // it = 1
System.out.println("---------------------------");
List<String> l2 = new LinkedList<String>();
// 表示l2這個集合隻支援放String類型的
List<Student> l3 = new LinkedList<Student>();
// 表示l3這個集合隻支援放Student類型的
}
}
泛型的定義
對于整個Java官方庫來說,整個List<E> 隻寫了一個, 而這個一個接口既能處理上面的Integer、又能處理String類型、又能處理Student類型等等,于是我們把它叫做泛型(即:廣泛的類型);
泛型的本質
我們看一下LinkedList源碼,我們知道尖括号代表泛型,尖括号裡面有個E,其實在這裡E就相當于這個類的形式參數,
而當我們建立對象的時候會傳一個Integer或String或Person進來,這裡的Integer或String或Person就相當于實際參數,把實際參數傳過來給這個形式參數接收,是以這裡E全部替換成Integer或String或Person,以後在使用E就代表Integer或String或Person,
這裡有點類似于方法的調用,隻是方法的調用傳的是數值,而泛型的調用傳的資料類型僅此而已,這是泛型的本質。
泛型的原理
泛型機制的原理就是參數化類型,也就是說使用E作為泛型機制的形式參數負責占位,當真正構造對象時需要使用真實的資料類型作為實參傳遞給E這個形參,進而類中的E全部變成了實參類型。
如何判斷哪些類支援泛型,哪些類不支援泛型,怎麼去判斷呢?