1. 程式人生 > >1.為什麼要用泛型

1.為什麼要用泛型

泛型程式設計(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》讀書筆記及個人理解解釋