В строке
class Bar<T extends Number> implements Foo<T> {
T
определяется в первом случае и используется во втором. extends Number
ограничивает тип, с которым можно создать экземпляр T
. Вы можете поставить такие ограничения только в том месте, где определено T
.
Это похоже на обычные параметры функции, где вы пишете тип только в объявлении, а не в тех местах, где вы используете параметр.