вообще не пойму логику как это
public static <D, H extends D, S extends H> void add(List<D> destinationList, List<S> sourceList) {
        ListIterator<D> destListIterator = destinationList.listIterator();
        ListIterator<S> srcListIterator = sourceList.listIterator();
        for (int i = 0; i < sourceList.size(); i++) {
            destListIterator.add(srcListIterator.next());
        }
    }
превратилось в это
public static <H> void add(List<? super H> destinationList, List<? extends H> sourceList) {
        ListIterator<? super H> destListIterator = destinationList.listIterator();
        ListIterator<? extends H> srcListIterator = sourceList.listIterator();
        for (int i = 0; i < sourceList.size(); i++) {
            destListIterator.add(srcListIterator.next());
        }
    }
public static void main(String[] args) {
        List<B> destination = new ArrayList<>();
        destination.add(new B());
        List<C> source = new ArrayList<>();
        source.add(new C());
        add(destination, source);
        System.out.println(destination);
        System.out.println(source);

static class A {
    }

    static class B extends A {
    }

    static class C extends B {
    }
}
<D, H extends D, S extends H> по сути есть D - родитель, его наследник H и его наследник - S. то есть параметр можно как-то обобщить в <? extends D> , но как он стал просто H ? далее интератор ListIterator<? super H> на месте Н был D. ? super Н(это любые суперклассы класса Н и сам класс Н) какие суперклассы если Д родитель всех. я не пойму ключевое - как узкое понятие расширяется как ему хочется? или можно было вообще не смотреть на изначальные типы, как подходить к решению задачи?