java遺珠之泛型萬用字元
版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/lastsweetop/article/details/83010344
我們在之前說過明確指定了泛型型別的引數之後,會把引數限制的很嚴格,萬用字元的作用就是放寬這種限制,有上限有界萬用字元<? extends A>
,下限有界萬用字元<? extends B>
,無界萬用字元<?>
。
上限有界是in變數,而下限有界是out變數,
雖然萬用字元可以使用在欄位,本地變數和方法中,但是類和外界的互動主要是方法,就限定的意義本身還是主要通過方法來體現,因此我們主要說方法。
考慮到萬用字元的一個弱點,遍歷和移除肯定是沒問題的,就是不能對萬用字元修飾的型別進行新增元素操作(可以新增null)。
比如:
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
表示,至於下限有界的真沒辦法。
那麼可以探討一下萬用字元的意義何在,為了暴露方法時更為一目瞭然?
因此,私以為能用泛型的情況下還是不用萬用字元了。