2014-04-21 64 views
1

我知道,在Collection<E>下面的方法:是否需要在直通方法中使用有界通配符泛型?

public void addAll(Collection<? extends E> subcollection); 

我們使用Collection<? super E>那裏允許單獨存在的子元素的集合,例如:

List<Drivable> drivables = new ArrayList<>(); 
List<Car> cars = new ArrayList<>(); 
//we need the wildcard here, because of the following line: 
drivables.addAll(cars); 

然而,這種界通配符我的以下方法需要嗎?

public static <E> Collection<E> requireNonEmpty(final Collection<E> collection) throws NoSuchElementException { 
    if (collection.isEmpty()) { 
     throw new NoSuchElementException("collection must be non-empty"); 
    } 
    return collection; 
} 

這使用了類似的成語作爲Objects.requireNonNull(T object),這實際上返回T object

那麼,是否有任何好處(或者它甚至是錯誤?)寫我的方法如下?

public static <E> Collection<? super E> 
    requireNonEmpty(final Collection<? extends E> collection); 
+0

您可能想要閱讀本文 - [Java泛型:什麼是PECS?](http://stackoverflow.com/q/2723397/738746)。 –

+0

@BheshGurung我已經讀過,但是我似乎無法將這些信息應用於我的用例。 – skiwi

+0

你的方法本身是通用的,所以你可以傳遞任何類型的集合給它。想象一下,如果類型參數「E」是在類級別聲明的,而你的方法是作爲實例方法聲明的,並且你想要方法來獲取E或E的任何子類/超類的集合,那麼你需要使用它。 –

回答

2

採用Collection<? extends E> subcollection使得通過參數萬能供體 - 即可以從自由閱讀。

您不需要從傳遞的集合中讀取對象,因此不需要任何通配符。

順便使用Collection<? super E> subcollection使其成爲通用收件人 - 即您可以添加到它。

請參閱When to use extends and super瞭解清楚。

也是一個很好的答案,涵蓋此Generic lower unbound vs upper bounded wildcards