I love the answer from @Bert F but this is the the-the-brain sees it.
I have a X in my hand. If I want to write my x into a list, which list needs to is either a list of X or a list of things that my x can b e upcast to as I write them in i.e. any superclass of X ...
List<? super X>
If I get a list and I want to read the X out of the so list, that better is a list of X or a list of things that can be upcast to x as I read them out, i.e. anything that extends X
List<? extends X>
Hope this helps.
These two work when the compiler does type erase (automatically helps us convert the type)
Extend is producer, used to obtain, if the container is a subclass of a class, then the compiler can safely convert its type to a base class or interface assigned to a reference to a base class or interface
Super is a consumer, used to add, if the container is a superclass of a class, then the compiler can safely put the subclass of the class to be put into the type of the superclass to assign a value to a location element
difference between <? Super t> and <? Extends t> in Java