Ответ 1
Вот некоторые отличия, которые мне сразу приходят в голову:
-
Ограничения параметра типа могут указывать несколько границ -
T extends A & B
, но с подстановочным знаком вы не можете указать несколько границ -? extends A & B
является недопустимым. -
Вы можете иметь нижние границы с подстановочным знаком -
? super A
действителен, но не с параметром типа -T super A
недействителен. -
Вы не можете использовать подстановочные рамки при создании родового типа. Вы должны использовать ограничения параметров типа.
-
Внутри метода, если вам нужна какая-то связь между параметрами параметров переданных аргументов, вам нужно использовать ограничения параметров типа. Например, вы хотите передать два параметризованных типа с одним и тем же параметром. Вы не можете сделать это с помощью подстановочных ограничений. Таким образом, в следующем объявлении метода будет использоваться два списка одного и того же типа, который расширяет
Number
.public <T extends Number> void merge(List<T> list1, List<T> list2) { }
Чтобы закончить, я добавлю некоторые моменты из Эффективной Java - Пункт 28: Используйте ограниченные подстановочные знаки для повышения гибкости API:
Для максимальной гибкости используйте типы подстановок для входных параметров, которые представляют производителей или потребителей. Если входной параметр является как производителем, так и потребителем, тогда типы подстановок не помогут вам: вам нужно точное совпадение типа, которое вы получаете без каких-либо подстановочных знаков.
Не используйте типы подстановочных знаков в качестве возвращаемых типов. Вместо того, чтобы предоставлять дополнительную гибкость для ваших пользователей, это заставит их использовать подстановочные типы в клиентском коде. Правильно используемые типы подстановочных знаков почти невидимы для пользователей класса. Они вызывают методы принятия параметров, которые они должны принимать, и отвергают те, которые они должны отклонить. Если пользователь класса должен думать о типах подстановочных знаков, возможно, что-то не так с API классов.
Литература: