4. 泛型
在JDK1.5中加入了泛型,類型不正確將在編譯期間知道,而不是在運行時導(dǎo)致異常錯誤
Item23 不要使用原始類型
例如當(dāng)使用到集合的時候
//bad
private final Collection stamps = ... ;
//good
private final Collection<String> stamps = ... ;
泛型保證數(shù)據(jù)的安全性
Item24 清除未經(jīng)檢查的異常
在Eclipse或者Android studio中,敲寫的代碼或多或少有一些紅色或黃色的警告,盡可能的消除這些警告
無法避免的話而且確保代碼無誤的話,慎重使用 @SuppressWarnings("unchecked")注解
Item25 集合和數(shù)組傾向集合
數(shù)組存儲類型較靈活,將會導(dǎo)致不可預(yù)期的運行時異常
盡量讓錯誤在編譯時暴露而不是在不可控的運行時
Item26 泛型類
略
Item27 泛型方法
略
Item28 使用有界通配符增加API的靈活性
List<String>不是List<Object>的子類型,這個是有意義的
你給List<Object>中放入任何對象,但是List<String>中只能存放String
但有時我們不想存放固定的類型,因此需要一些靈活性
public class Stack<E> {
public Stack();
public void push(E e);
public E pop();
public boolean isEmpty();
}
//push所有元素
public void pushAll(Iterable<E> src) {
for (E e : src)
push(e);
}
//使用
Stack<Number> numberStack = new Stack<Number>();
Iterable<Integer> integers = ... ;
numberStack.pushAll(integers);
上述代碼編譯正常,看著也沒什么問題 然而當(dāng)我們添加的src不是我們期望的類型呢 如Stack<Number>,我們添加push(int) int將被自動裝箱成Integer Integer也是Number的子類型
然而
//error
pushAll(Iterable<Number>) in Stack<Number>
cannot be applied to (Iterable<Integer>)
numberStack.pushAll(integers);
幸運的是Java提供了一種機(jī)制來解決子類的問題
// Wildcard type for parameter that serves as an E producer
public void pushAll(Iterable<? extends E> src) {
for (E e : src)
push(e);
}
經(jīng)典原則:PECS stands for producer-extends, consumer-super.
Item29 多參數(shù)的泛型安全
略