Я предполагаю, что вы говорите об использовании extends в объявлениях параметров типа. В этом случае:
class My_Abstract<T extends SomeAbstract>
имеет параметр ограниченного типа, называемый T
, который должен быть SomeAbstract
или какой-либо его подтип.
class My_Abstract<SomeAbstract>
имеет параметр неограниченного типа, называемый SomeAbstract
, который может быть любым. Обратите внимание, что SomeAbstract
больше не относится к фактическому типу SomeAbstract
, который вообще используется в первом примере!
Чтобы расширить это: представьте, было ли второе объявление class My_Abstract<T>
. T
- это явно параметр типа, а не фактический тип. Но его не обязательно называть T
... его можно назвать E
или Bob
или SomeAbstract
. Во всех этих случаях это все еще просто параметр типа ... фактический тип никогда не может туда идти, и при этом это не имеет никакого смысла (весь смысл параметра типа в том, что он НЕ ссылается на конкретный тип, но вместо этого позвольте другим типам помещаться на его место при создании экземпляров класса).
В отредактированном коде измените объявление My_Child
на
class My_Child extends My_Abstract<Object>
и вы увидите разницу. Если вы попытаетесь что-то сделать, используя параметр типа SomeAbstract
во второй версии, вы также обнаружите, что не можете вызывать методы, объявленные в реальном классе SomeAbstract
. Это хороший пример того, почему вы всегда должны следовать соглашению об использовании однобуквенных параметров типа ... это действительно сбивает с толку, если вы этого не сделаете.
Это становится действительно длинным, но я также хочу отметить, что все это в основном не связано с первой половиной вашего вопроса. Подстановочные знаки, такие как ? extends SomeAbstract
и ? super SomeAbstract
, не используются в объявлениях параметров типа (например, используемых при определении универсального класса), они в основном используются для параметров метода. List
является типичным примером для объяснения необходимости подстановочных знаков, потому что его природа как контейнера объектов делает его относительно простым для понимания, но относящиеся к ним правила применяются к любому универсальному типу. Я попытался объяснить это в общих чертах в этом ответе .