Имея следующую простую структуру класса:
class A {
}
class B extends A {
}
class C extends B {
}
Я создаю ArrayList для хранения объектов ранее созданных классов:
List<? extends A> list1 = new ArrayList<A>();
List<? extends B> list2 = new ArrayList<B>();
List<? extends C> list3 = new ArrayList<C>();
List<? super A> list4 = new ArrayList<A>();
List<? super B> list5 = new ArrayList<B>();
List<? super C> list6 = new ArrayList<C>();
В каждый из этих списков я пытаюсь добавить 1 объект каждого ранее созданного класса: A, B, C. Единственная возможная комбинация:
-
добавить объект класса A, B, C в список4
-
добавление объекта класса B и C в список5
-
добавить объект класса C в список list6. Остальные попытки дают ошибки компилятора, такие как:
Метод add (capture # 1-of? extends A) в списке типов не применяется для аргументы (A)
Почему я не могу добавить объект класса A, B, C в список1/2/3? Почему, например, list4 принимает объекты классов A, B, C, если они должны быть суперкласс класса A, поскольку список4 определен?