Java Generics is confusing probably because it wasn't included from the very beginning. Rather than using reification (not certain about that but I think it means there is an object associated which records the type information) Java uses erasure, which means all type information is deleted at runtime.
Rakesh Sugirtharaj is quite correct that <? super T> means T or any of its superclasses. The ? bit is pronounced "unknown" and it means that a generic type can be a subclass of another generic type, as well as their <T> being subclasses of each other. You will find a nice clear explanation about the difference between Cage<Animal> Cage<Lion> and Cage<Butterfly> in the
Java� Tutorials.