1.為什麼要用泛型
阿新 • • 發佈:2019-01-04
泛型程式設計(Generic programming) 意味著編寫的程式碼可以被很多不同型別的物件所重用
在增加泛型類之前,ArrayList類只維護一個Object引用的陣列:
public class ArrayList {
private Object[] elementData;
...
public Object get(int i) {...}
public void add(Object o) {...}
}
而這會產生兩個問題:
【1】獲取一個值時必須進行強制型別轉換:
ArrayList files = new ArrayList();
// 輸入後將以Object的形式儲存
files.add("e://fatmanhappycoding.txt");
// 將獲取到的Object轉化成String
String filename = (String)files.get(0);
【2】沒有錯誤檢查,可以向陣列列表新增任何類的物件
往本來應該存放String的files中加入檔案物件
files.add(new File("..."));
這麼做在編譯和執行都不會出錯
但是在使用時我看不出來這個files到底是存放了String型別的物件還是File還是其他的什麼物件,所以在使用時很可能會對存放了File型別物件的files執行:
String filename = (String)files.get(1); // 裡面存放了File物件
此時就會產生錯誤
所以,泛型提供了一個解決方案:型別引數:
ArrayList<String> files = new ArrayList<String>();
這樣提高了可讀性,使我們一看就知道里面存放了String物件
在Java SE 7後我們可以這樣寫: ArrayList files = new ArrayList<>();
例:
public class ArrayList<T > {
private T[] elementData;
...
public T get(int i) {...}
public void add(T t) {...}
}
使用上面例子中採用泛型的ArrayList:
ArrayList<String> files = new ArrayList<>();
String filename = files.get(0);
此時不用進行轉換,編譯器通過get方法的型別引數便知道了這是String型的,add也同理,因此,現在用add來向files新增File型別的物件則會報錯
因此,泛型使得程式有更好的可讀性和安全性
注:本文為《Java 核心技術 卷I》讀書筆記及個人理解解釋