Effective Java Item26 不要使用原型類型
整理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才發現。雖然使用原型類型(沒有類型參數的泛型)是完全合法的,但必須要禁止使用。
最後附上名詞解釋對照表
Term | Example |
---|---|
Parameterized type | List |
Actual type parameter | String |
Generic type | List |
Formal type parameter | E |
Unbounded wildcard type | List<?> |
Raw type | List |
Bounded type parameter | <E extends Number> |
Recursive type bound | <T extends Comparable> |
Bounded wildcard type | List<? extends Number> |
Generic method | static List asList(E[] a) |
Type token | String.class |
Read other posts