вообще не пойму логику как это
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 Н(это любые суперклассы класса Н и сам класс Н) какие суперклассы если Д родитель всех. я не пойму ключевое - как узкое понятие расширяется как ему хочется? или можно было вообще не смотреть на изначальные типы, как подходить к решению задачи?