Я знаю, что в следующем методе в 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
делает его универсальным получателем - то есть вы можете добавить к нему.
См. Когда использовать расширения и супер для четкого введения.
Также хороший ответ, охватывающий этот общий нижний несвязанный и верхний ограниченные подстановочные знаки.