I can understand easilyHierarchy 2 : A<T> <<< A<? super T> <<< A<? super S> Example: List<Number> is a subtype of List<? super Number> and List<? super Number> is a subtype of A<? super Integer> Thus, if an overridden method returns List<? super Number>, the overriding method can return List<Number> but not List<Integer> or List<? super Integer>.
It is important to understand that List<Integer> is not a subtype of List<Number> even though Integer is a subtype of Number.
But I can't understand why:Hierarchy 1 : A<S> <<< A<? extends S> <<< A<? extends T> Example: Since Integer is a subtype of Number, List<Integer> is a subtype of List<? extends Integer> and List<? extends Integer> is a subtype of A<? extends Number>. Thus, if an overridden method returns List<? extends Integer>, the overriding method can return List<Integer> but not List<Number> or List<? extends Number>.
1 - "List<? super Number> is a subtype of A<? super Integer>" instead of super type
2 - List<Integer> is not a subtype of List<Number> even though Integer is a subtype of Number