java generics ограниченные подстановочные знаки `? супер ? расширяет T`

Я натыкаюсь на эту проблему миллион раз, и я не могу понять это.

Предположим, у меня есть поток seq типа Stream<? extends T>, и я хочу выполнить forEach для его элементов.

Тип потребителя теперь становится Consumer<? super ? extends T>, как теперь java обрабатывает универсальный тип ? super ? extends T?

Является ли он эквивалентом ? super T, потому что универсальный тип ? extends T в этом примере рассматривается как T.

Кто-нибудь, пожалуйста, предоставьте точную процедуру того, как компилятор java обрабатывает следующие ситуации.


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