爲什麼使用泛型
- 泛型實質上就是使程序員定義安全的類型,在沒有出現泛型之前,Java也提供了對Object的引用“任意化”操作,這種操作就是對Object引用進行向上轉型或者向下轉型的操作,但某些強制類型轉換的錯誤不會被編譯器捕捉,而在運行後出現了異常,可見強制類型轉化存在安全隱患,所以提供了泛型機制。
public class OverClass<T> { //定義泛型類
private T over; //定義泛型成員變量
public T getOver(){ //設置getOver方法
return over;
}
public void setOver(T over){ //設置setOver方法
this.over=over;
}
public static void main(String[] args) {
//實例化一個Boolean對象
OverClass<Boolean> over1 = new OverClass<Boolean>();
//實例化一個Float型對象
OverClass<Float> over2 = new OverClass<Float>();
over1.setOver(true); //不需要進行類型轉換
over2.setOver(12.3f);
Boolean b = over1.getOver(); //不需要進行類型轉換
Float f = over2.getOver();
System.out.println(b);
System.out.println(f);
// TODO Auto-generated method stub
}
}
- 菱形運算符
GenericMemoryCell<Integer> m = new GenericMemoryCell<Integer>(); //這裏就很麻煩
GenericMemoryCell<Integer> m = new GenericMemoryCell<>(); //這樣就簡化了代碼,這就是菱形運算符
- 帶有限制的通配符
主要作用是在創建一個泛型類對象時限制這個泛型類的類型實現或者繼承某個接口或類的子類,可以使用extends 或者 super 來對泛型加以限制。
A<?extends List> a = null;
a = new A<ArrayList>();
a = new A<LinkedList>();
//如果實例化沒有實現List接口的泛型對象,編譯器就會報錯。例如實例化HashMap對象是=時,編譯器就會報錯
//如果使用A<?> 這種形式實例化對象,則默認表示可以將A指定實例化Object及以下的子類類型
List<String> l1 = new List<String>();
l1.add("成員");
List<?> l2 = new LinkedList<Integer>();
l2.set(0, "成員改變"); //使用通配符聲明的名稱實例化的對象不能對其加入新的信息,set()方法不能被調用,只能獲取或者刪除
類型擦除
泛型在很大程度上時Java語言的成分而不是虛擬機中的結構。泛型類可以由編譯器通過所謂的泛型擦除過程轉變成非泛型類。這樣編譯器就生成了一種與泛型類同名的原始類。對於泛型的限制
基本類型
基本類型不能作爲參數類型。我們必須使用它們的包裝類
instanceof檢測
instanceof檢測和類型轉換隻是對原始類做的
static語境
在一個泛型類中,static和static域都不可以引用類的類型變量,因爲在類型擦除後就不存在了
泛型類型的實例化
不能創建一個泛型類型的實例
T obj = new T(); //右邊是非法的
泛型數組對象
不能創建一個泛型數組
T[ ] arr = new T[10]; //右邊是非法的
參數化類型數組
參數化類型數組是非法的