java泛型中的萬用字元,java泛型萬用字元
概述
在學習java中泛型這塊內容的時候,剛開始非常容易理解,但是,到萬用字元的時候,我就暈了,因為學習java這塊內容的指導思想,是比對著.net來的,可是java中的萬用字元,.net中沒有這樣的概念,於是花時間學習了一下,下面通過例子向大家講解萬用字元
執行個體代碼
package com.tgb.mydemo;import java.util.ArrayList;import java.util.List;public class Test {public static void main(String[] args){Integer[] integers = {1,2,3,4,5};ArrayList<Integer> integerList = new ArrayList<Integer>();for (Integer integer : integers) {integerList.add(integer);}System.out.println("Total of the elements in integerList:" + sum(integerList));Double[] doubles = {1.1,2.2,3.3,4.4,5.5};ArrayList<Double> doubleList = new ArrayList<Double>();for (Double element : doubles) {doubleList.add(element);}System.out.println("Total of the elements in integerList:" + sum(doubleList));Number[] numbers = {1.1,2.2,3,4,5.5};ArrayList<Number> numberList = new ArrayList<Number>();for (Number element : numbers) {numberList.add(element);}System.out.println("Total of the elements in integerList:" + sum(numberList));}public static double sum(ArrayList<Number> list){double total = 0;for(Number element : list ){total += element.doubleValue();}return total;}} 註:Number是Double和Integer的父類
將上面的代碼放在java的IDE中,會出現語法錯誤,為什麼呢?因為sum函數的參數類型為ArrayList<Number>,我們使用sum函數時,給其傳遞的是ArrayList<Integer>或者ArrayList<Double>類型,雖然Number類型是Double和Integer類型的父類,但是,編譯器不把ArrayList<Number>和ArrayList<Integer>(ArrayList<Double>)當成同一個類型看待,所以,此時,就會在代碼編輯的時候,報錯,如果我們sum中的參數類型換成ArrayList<? extends Number>,就解決了這個問題,而“?”就是萬用字元,這個也就是為什麼出現了萬用字元。
萬用字元和泛型約束的區別
這裡說的泛型約束是定義泛型類時的泛型約束,從這句話我們也就知道了,泛型約束是在定義泛型類時使用的,是定義泛型類時對泛型做的一個約束,萬用字元是在使用泛型類時,對類型做的一個約束。
萬用字元的約束種類
萬用字元的約束有3種。
無約束:<?>,即,類型的父類必須是Object類型。
上限約束:<? extends 類型1>,即,類型必須是類型1的子類或者是類型1。
下線約束:<? super 類型1>,即,類型必須是類型1的父類或者是類型1。
總結
萬用字元使我們在使用泛型類本該給出具體類型的情況,變成了,將具體類型給參數化了的情況,從而使得最終使用者的範圍變得更小了。