Я натыкаюсь на эту проблему миллион раз, и я не могу понять это.
Предположим, у меня есть поток seq
типа Stream<? extends T>
, и я хочу выполнить forEach
для его элементов.
Тип потребителя теперь становится Consumer<? super ? extends T>
, как теперь java обрабатывает универсальный тип ? super ? extends T
?
Является ли он эквивалентом ? super T
, потому что универсальный тип ? extends T
в этом примере рассматривается как T
.
Кто-нибудь, пожалуйста, предоставьте точную процедуру того, как компилятор java обрабатывает следующие ситуации.
? super T
. Если у вас естьStream<? extends Number>
,Consumer<Integer>
будет недействительным, ноConsumer<Number>
иConsumer<Object>
по-прежнему должны применяться. Не должно быть сложно проверить. - person shmosel   schedule 06.09.2017? super U
. гдеU
==? extends T
. По сути, для кода это похоже на? super T
, поскольку вы принимаете контравариантную границу чего-то, что расширяетT
. Посмотрите ковариантность против контравариантности. - person Rogue   schedule 06.09.2017Stream
преобразуется для того, чтобы рассматривать тип параметра какforEach
, поэтому тип параметраforEach
фактически становится чем-то вродеConsumer<? super CAP#1>
, гдеCAP#1
является результатом преобразования захвата для аргумента типа? extends T
. Я объяснил преобразование захвата в другом ответе здесь, и TBH, мне действительно не хочется писать еще один ответ о преобразовании захвата сегодня. Преобразование захвата является реальным ответом. - person Radiodef   schedule 06.09.2017