整理Effective Java書中Item 26: Don’t use raw types心得筆記

主旨

直接了當的說不要直接使用原型類型,如果使用原型類型就失去了泛型的安全性以及優勢。

點出問題

在泛型出現之前,我們會這樣使用如下:

List number = new ArrayList();
number.add(1);
number.add(2);

int total = 0;
for (int i = 0; i < number.size(); i++) {
    total += (int) number.get(i);
}

在泛型出現之後,我們會這樣使用如下:

List<Integer> number = new ArrayList();
number.add(1);
number.add(2);

Integer total = 0;
for (int i = 0; i < number.size(); i++) {
    total += number.get(i);
}

List interface多了一個類型參數E,List<E>,我們可以直接告訴編譯這個集合要存放甚麼類型在裡面。安全又不用轉型,讓編譯器直接幫你檢查是否合法。如果在第一個範例手誤加一個字串number.add("3");也不會編譯錯誤,直到執行到total += (int) number.get(i);就會噴了ClassCastException才發現。雖然使用原型類型(沒有類型參數的泛型)是完全合法的,但必須要禁止使用。

最後附上名詞解釋對照表

TermExample
Parameterized typeList
Actual type parameterString
Generic typeList
Formal type parameterE
Unbounded wildcard typeList<?>
Raw typeList
Bounded type parameter<E extends Number>
Recursive type bound<T extends Comparable>
Bounded wildcard typeList<? extends Number>
Generic methodstatic List asList(E[] a)
Type tokenString.class