1. 程式人生 > >java遺珠之泛型萬用字元

java遺珠之泛型萬用字元

我們在之前說過明確指定了泛型型別的引數之後,會把引數限制的很嚴格,萬用字元的作用就是放寬這種限制,有上限有界萬用字元<? 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表示,至於下限有界的真沒辦法。

那麼可以探討一下萬用字元的意義何在,為了暴露方法時更為一目瞭然?

因此,私以為能用泛型的情況下還是不用萬用字元了。