2016-11-08 120 views
1
public static void main(String args[]) { 
    List<Double> doubleList = new ArrayList<>(); 
    doubleList.add(new Double(101.215D)); 
    doubleList.add(new Double(102.215D)); 
    doubleList.add(new Double(103.215D)); 

    printIntValue1(doubleList); 
    System.out.println("*******"); 
    printIntValue2(doubleList); 
} 


//bounded parameter 
public static <T extends Number> void printIntValue1(List<T> list){ 
    for(T num : list){ 
     System.out.println(num.intValue()); 
    } 
} 
//Wildcard parametr 
public static void printIntValue2(List<? extends Number> list){ 
    for(Number num : list){ 
     System.out.println(num.intValue()); 
    } 
} 

如上面的兩種方法,兩者都給出了相同的結果。 有人可以告訴我,如果所有的工作已經完成了有界的類型,那麼爲什麼通配符的概念在那裏?通配符是否執行一些其他限制類型的工作?通配符類型與有界類型之間的區別

+0

在Java中,泛型只爲您提供編譯時安全性和檢查功能,僅此而已。在第一種情況下,你有一個'T',你可以用來表示你的具體類型,在第二種情況下你不需要;就這樣。 – vaxquis

回答

1

我認爲從你的例子的角度來看,使用通配符沒有什麼好處。 然而,我相信引入通配符是爲了支持使用相關類型參數的泛型類型的賦值(或相關結構)。

考慮:

List<Number> numberList = new ArrayList<Double>(); //Won't compile 

對比度,爲:

List<? extends Number> anyNumberList = null; 
anyNumberList = new ArrayList<Double>(); 
anyNumberList = new ArrayList<Integer>(); 

第二個片段是有效的代碼。

我同意,從方法參數類型的角度來看,通配符類型不具有相當多的特殊優點。

相關問題