Я не могу найти какой-либо пример, где подстановочные знаки нельзя заменить универсальным. Например:
public void dummy(List<? extends MyObject> list);
эквивалентно
public <T> void dummy(List<T extends MyObject> list);
или
public <T> List<? extends T> dummy2(List<? extends T> list);
эквивалентно
public <T, U> List<U extends T> dummy(List<U extends T> list);
, поэтому я не до курсе, почему подстановочный знак был создан в качестве дженериков уже выполняет работу. Любые идеи или комментарии?