2014-02-10 41 views
-1

看這兩個例子:通配符:談論「對象」與「?」

void printCollection(Collection<Object> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

VS

void printCollection(Collection<?> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

的是這兩者之間的區別?我讀到第二個例子更強大。但爲什麼呢?你不能傳遞給方法1的哪個參數,你可以傳遞給方法2?

回答

3

泛型aren't covariant。換句話說,Collection<String>不是Collection<Object>,即使StringObject。第一個簽名,我不能打印List<String>例如。

通用通配符可協助表示協方差(如您的示例)和反變量。 Collection<?>Collection<? extends Object>的縮寫,意思是「一些特定的未知類型的集合,它是或延伸了Object」。因此,我們無法添加任何內容,除了null這樣的集合,因爲我們無法保證添加的對象的類型是有效的。

這是一個使用通配符來表達逆變一個例子:

void populateCollection(Collection<? super Integer> c) { 
    for (int i = 0; i < 10; i++) { 
     c.add(i); 
    } 
} 

我能通過一個Collection<Object>Collection<Number>,或Collection<Integer>到這種方法,因爲它是作爲一個消費者Integer小號處理。在您的示例中,該集合是生產商Object s。有關通配類型的「生產者」和「消費者」之間的區別,請參閱此帖以獲得進一步閱讀:What is PECS (Producer Extends Consumer Super)?