Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。
泛型的本質(zhì)是參數(shù)化類型潮剪,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。
泛型方法
- 所有泛型方法聲明都有一個類型參數(shù)聲明部分(由尖括號分隔),該類型參數(shù)聲明部分在方法返回類型之前扰付。
- 每一個類型參數(shù)聲明部分包含一個或多個類型參數(shù),參數(shù)間用逗號隔開仁讨。一個泛型參數(shù)羽莺,也被稱為一個類型變量,是用于指定一個泛型類型名稱的標識符洞豁。
- 類型參數(shù)能被用來聲明返回值類型盐固,并且能作為泛型方法得到的實際參數(shù)類型的占位符。
- 泛型方法體的聲明和其他方法一樣丈挟。注意類型參數(shù)只能代表引用型類型刁卜,不能是原始類型(像int,double,char的等)。
public <E> void function(E e) {
}
泛型類
和泛型方法一樣曙咽,泛型類的類型參數(shù)聲明部分也包含一個或多個類型參數(shù)蛔趴,參數(shù)間用逗號隔開。一個泛型參數(shù)例朱,也被稱為一個類型變量孝情,是用于指定一個泛型類型名稱的標識符。因為他們接受一個或多個參數(shù)茉继,這些類被稱為參數(shù)化的類或參數(shù)化的類型咧叭。
public class Example<T> {
private T t;
}
類型通配符
- 類型通配符一般是使用?代替具體的類型參數(shù)。
- 類型通配符下限通過形如 List<? extends Number>來定義烁竭。
- 類型通配符下限通過形如 List<? super Number>來定義菲茬。
泛型擦除
Java的泛型是偽泛型,這是因為Java在編譯期間派撕,所有的泛型信息都會被擦掉婉弹,正確理解泛型概念的首要前提是理解類型擦除。Java的泛型基本上都是在編譯器這個層次上實現(xiàn)的终吼,在生成的字節(jié)碼中是不包含泛型中的類型信息的镀赌,使用泛型的時候加上類型參數(shù),在編譯器編譯的時候會去掉际跪,這個過程成為類型擦除商佛。
例如:List<String> 和 List<Integer> 在編譯后都變成 List喉钢。
那從list中取數(shù)據(jù)時為何不需要做類型轉(zhuǎn)換呢?
在ArrayList的get()方法中有默認實現(xiàn):
public E get(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
return (E) elementData[index];
}