Есть ли необходимость в использовании обобщенных шаблонных шаблонов в методе сквозной передачи?

1

Я знаю, что в следующем методе в 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);
  • 0
    Возможно, вы захотите прочитать это - Generics Java: Что такое PECS? ,
  • 0
    @BheshGurung Я прочитал это, однако я, кажется, не могу применить эту информацию в моем случае использования здесь.
Показать ещё 4 комментария
Теги:
generics
bounded-wildcard

1 ответ

2

Использование Collection<? extends E> subcollection Collection<? extends E> subcollection делает переданный параметр универсальным донором - то есть его можно читать со свободой.

Вам не нужно читать объекты из прошедшей коллекции, поэтому вам не нужны подстановочные знаки.

Кстати, используя Collection<? super E> subcollection Collection<? super E> subcollection делает его универсальным получателем - то есть вы можете добавить к нему.

См. Когда использовать расширения и супер для четкого введения.

Также хороший ответ, охватывающий этот общий нижний несвязанный и верхний ограниченные подстановочные знаки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню