I'm not sure if the following example will make sense, but this is what i understood:
---------------------------------------------------
In case of <T extends
String>, the compiler will replace all occurrences of T with 'String' (i.e. upper bound) with Type Erasure. And this makes perfect sense.
Had this been allowed (which is not)
<T super String>, then the compiler has to replace all occurrences of T with Object; in which case even object of type Dog can be passed to T.