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全部變成了實參類型。
如何判斷哪些類支持泛型,哪些類不支持泛型,怎麼去判斷呢?
只要看到類也好、接口也好,只要它的名字後面有尖括號,無論尖括號裏面的字母是什麼,就表示這個接口支持泛型,泛型的意思就是說創建對象的時候傳個數據類型作爲實參了。
一句大白話說明泛型機制就是:參數化類型。 說白了就是讓數據類型作爲參數傳遞。