Class<? extends Integer>
будет компилироваться нормально, но Integer
является окончательным типом, поэтому нет смысла использовать его в качестве верхней границы (ничто никогда не extend
его).
Если вы попытаетесь использовать окончательный тип в качестве верхней границы для параметра типа, вы получите предупреждение компилятора:
Параметр типа T не должен быть ограничен конечным типом Integer. Окончательные типы не могут быть расширены
Почему использование окончательного типа в качестве верхней границы для подстановочного знака было бы совершенно нормально, но выдавало бы предупреждение для параметра типа? Почему Java даже позволяет ограничивать подстановочные знаки конечным верхним типом?