2014-04-21 1 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 Generics: Что такое 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.

 Смежные вопросы

  • Нет связанных вопросов^_^