Brian, when you say <? super String>, then you are sure that its a super type of String. So whatever ? is, it is higher than String in the class Hierarchy. So it will definitely be able to fit a String into it. I think you understand this as it is simple
polymorphism. Eg
But when you say <? extends Number>, then you are not sure what ? exactly is. You are only sure that its a sub-type of Number. It could be Integer, or Float, or anything. So how can you add an Integer or Float to it. Suppose you add an Integer to it but it actually is a list of Float. Then this would be disastrous. So when you use the extends
word with ?, then you are not allowed to add any elements. But one thing's for sure, and that is that the elements will fit into Number as the actual type would be a sub-type of Number (or Number itself). So you can get elements from that list into Number references
With the super syntax, you do not have this liberty. When you say <? super String> then ? could be anything. So you can only get elements from that list into references of type Object as it is the base type of all the types so you are sure, whatever objects are in the list, they will fit into Object type