For your first question, what you need to understand is the difference between a type variable (JLS 4.4. p. 49) and a type argument (JLS 4.5.1. p.52).
If you read the JLS, you will notice that it says that type variables are used on generic class and interface declarations and in generic method declarations. And this type of declarations only accept "extends" clause, and not the "super". For instance, your method could be declare as follows:
Now, type argument is a different thing and they are allowed to use wildcards. Your confusion is based on the fact that one of the wildcards is named also "extends", a clear example of
Java language
polymorphism. In this case, the clause is used for two different things.
As its name suggest, you can use this to declare the expected type of arguments. For instance, you can say:
Or in a method declaration.
You can combine both, like this:
Later I will try to reply to your other questions, because this takes time.