Зачем в дженериках используется ?, и эквивалентен ли он T/E?
Встретил такую конструкцию Function<? super T, ? extends U>
Никогда не задумывался, зачем нужен ?.
Эквивалентен ли код выше такому коду: Function<E super T, E extends U>.
Если да, то зачем использовать ?.
<?> - неограниченная маска, означает "что угодно", в большинстве случаев компилятор не видит разницы между T и <?>.
Без ? вы сможете больше сделать с параметрами, а с ? - принимать более широкий диапазон параметров.
А допустим в дженерике стоит так <? extends U<? extends T>> - пропустит ли дженерик два разных класса вместо ?, или там должны быть 2 одинаковых класса?
Без ? вы сможете больше сделать с параметрами
- что сделать и как?
с ? - принимать более широкий диапазон параметров.
- какие параметры, которые нельзя принимать используя < T > , и можно принимать используя <?>?
Посмотрите главу 5 книги Джошуа Блоха Эффективное программирование на Java. Называется в русском переводе "Средства обобщённого программирования". Там как раз на примере consumer/producer описаны различия.
? extends U - некоторый тип, который является потомком U, ? super T - некоторый тип, который является предком Т. Ваша схема(так как у Вас написано), как правило применяется: первая часть для приемника, вторая для источника при обработке чего либо.