Writing
binds the type name T
, so that it can be referred to later in the definition (including in the parameter list).
If you wrote extends Animal>
, then you did not name the type. Therefore, you cannot refer to it later. You can't refer to it as ?
later because that could be ambiguous (what if you had two type parameters?).
Java forbids you from writing public > ...
because such a declaration is useless (the type parameter is not named so it cannot be used).