java遺珠之泛型萬用字元
阿新 • • 發佈:2018-12-14
我們在之前說過明確指定了泛型型別的引數之後,會把引數限制的很嚴格,萬用字元的作用就是放寬這種限制,有上限有界萬用字元<? extends A>
,下限有界萬用字元<? extends B>
,無界萬用字元<?>
。上限有界和無界經常使用,下限有界暫時還沒想到可以用在什麼地方。
雖然萬用字元可以使用在欄位,本地變數和方法中,但是類和外界的互動主要是方法,就限定的意義本身還是主要通過方法來體現,因此我們主要說方法。
考慮到萬用字元的一個弱點,遍歷肯定是沒問題的,就是不能對萬用字元修飾的型別進行更改操作。
比如:
void swapFirst(List<? extends Number> l1, List<? extends Number> l2) {
Number temp = l1.get(0);
l1.set(0, l2.get(0)); // expected a CAP#1 extends Number,
// got a CAP#2 extends Number;
// same bound, but different types
l2.set(0, temp); // expected a CAP#1 extends Number,
// got a Number
}
編譯階段居然會報錯,編譯器無法確認型別是正確的,因為你輸入的具體型別可能是Number
的子類哦。
這種情況下還是寫泛型來的舒服,也能達到同樣的效果
<E extends Number> void swapSecond(List<E> l1, List<E> l2) {
E temp = l1.get(0);
l1.set(0, l2.get(0));
l2.set(0, temp);
}
這樣就可以正常工作了。
上面是上限的可以用這種替換,如果是無界的可以直接用T
表示,至於下限有界的真沒辦法。
那麼可以探討一下萬用字元的意義何在,為了暴露方法時更為一目瞭然?
因此,私以為能用泛型的情況下還是不用萬用字元了。