簡體   English   中英

是否需要在直通方法中使用有界通配符泛型?

[英]Is there a need to use bounded wildcard generics in a passthrough method?

我知道在Collection<E>的以下方法中:

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

我們使用Collection<? super E> 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);

使用Collection<? extends E> subcollection Collection<? extends E> subcollection使傳遞的參數成為通用施主 -即可以自由讀取。

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

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

有關清楚的介紹,請參見何時使用擴展和超級

涵蓋此通用較低未綁定vs較高邊界通配符的好答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM