使用萬用字元增強泛型

sanqima發表於2014-06-05

      泛型中使用“?”作為萬用字元。萬用字元的使用與普通型別引數類似,如萬用字元也可以利用extends關鍵字來設定取值上限。

<? extends Number>表示Byte、Double、Float、Integer等都適合這個型別引數。此外,萬用字元還可以設定取值下限,語法如下:

    <? super Number>表示型別引數是Number類的父類,如Object。

設計過程:

    編寫WildcardsTest類,該類包含兩個方法:getMiddle()方法獲得給定列表的中間值,該方法的引數中要求列表引數的型別是任何Number型別的子集;

main()方法用來進行測試。程式碼如下:

public class WildcardsTest {
    public static Object getMiddle(List<? extends Number> list) {
        return list.get(list.size() / 2);
    }
    
    public static void main(String[] args) {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(1);
        ints.add(2);
        ints.add(3);
        System.out.print("整型列表的元素:");
        System.out.println(Arrays.toString(ints.toArray()));
        System.out.println("整型列表的中間數:" + getMiddle(ints));
        List<Double> doubles = new ArrayList<Double>();
        doubles.add(1.1);
        doubles.add(2.2);
        doubles.add(3.3);
        System.out.print("浮點列表的元素:");
        System.out.println(Arrays.toString(doubles.toArray()));
        System.out.println("浮點列表的中間數:" + getMiddle(doubles));
    }
}

總結:

     Java中的陣列支援協變型別,即如果方法引數是陣列T,而S是T的子類,則方法也可以使用引數S。

對於泛型類則沒有這個特性。為了彌補這個不足,Java推出了萬用字元型別引數。在本例項中,只需要宣告引數型別為List<? extends Number>的一個方法,就可以使用List<Integer>、List<Double>、List<Long>等型別引數。

效果如下:


相關文章