? extends R
означает, что вы можете передать объект, класс которого получен из R
, он же подкласс R
.
Таким образом, функция карты может выдавать R
и R's subclass
в результате.Это разумно.
Например, если у нас есть эти классы: Animal
, Groose (extends Animal)
, Egg
Function<Egg, Groose> hatching
Вы можете написать этот код:
List<Egg> eggs = getEggs();
List<Animal> myPets = eggs.stream().map(hatching)....
Вы можете видеть, что вашей функции map
требуется тип Animal
(R
), но ваш маппер возвращает тип Groose
(то есть ? extends R
).Если функция map
записывается как <R> Stream<R> map(Function<? super T, R> mapper);
, вам нужно добавить еще одно преобразование из Groose
в Animal
.
. Вы можете обратиться к этому ответу и понять <? extends T>
.