標籤:java泛型學習
JAVA泛型學習
泛型是JAVA在JDK1.5提出的新特性,主要是為了代碼的安全性和代碼的重複利用。
安全性:在沒有提出泛型時,主要是通過傳遞Object來實現傳入類型的引用,然後在取得資料時進行強制類型轉換,但是這樣會存在一個問題,就是比如一個集合中存入了A類型的資料,然後遍曆集合擷取A類型的資料時,需要(A)Object來強制轉換,如果集合中也存入了一個B類型的資料,那麼在編譯期間不會報問題,運行時就會出現問題,因為無法將一個B類型的資料轉換為A類型的資料,也就是類型轉換異常。為瞭解決這個問題,提出了泛型的概念。這樣就可以在將B存入集合前就進行限定,並且在取資料時,無需強制類型轉換,減少了代碼的運行異常錯誤。
我們知道數組是相同資料類型的一個集合,缺點就是數組的容量是固定的,無法動態擴充。如果集合對放入其中的物件類型做一個限定,也就可以看成為一個相同物件類型且能動態擴充容量的對象“數組”(集合)。這樣我們在存入資料和取出資料時,都能知道資料的類型,泛型就是提供這種想法的功能實現。
代碼重複利用:也有解釋為動態功能,即能根據運行時傳遞的類型來自動匹配.
1) 泛型類
public class Demo<E>{
private E e;
Demo(E e){
this.e=e;
}
public E getE(){
return e;
}
}
String b="hello";
Demo demo=new Demo(String b);
String a=demo.getE();
Demo demo1=new Demo(30);//這裡不是基本類型,而是自動封裝為Integer對象傳遞。
Integer iter=demo1.getE();
從上面可以看出,通過傳遞不同的參考型別給類,即可得到對應的參考型別對象。
2)泛型方法(泛型方法與泛型類沒有必然的關係,可以是普通類,但是類中方法為泛型方法)
public class Test{
public <E> void demo(E e){
System.out.println(E.class.getName()); //輸出class對象的名稱
}
public <E> E demo1(E e){
....
return e;
}
}
3)泛型介面
public interface Test<E>{
.....
}
4)萬用字元 ? 如果不對?進行類型的限定,則可以傳遞Object或者其子類進入.(任意類都可以)
? extends E:代表只能傳遞進入E或者E的子類。
? super E:代表只能傳遞E或者E的父類。
5)多重泛型
? extends E & interface名 & interface名1 ..... 代表E及其子類並實現了後面的介面的類。
JAVA泛型學習