Я читаю об общих методах из OracleDocGenericMethod . Меня очень смущает сравнение, когда в нем говорится, когда использовать подстановочные знаки, а когда - общие методы. Цитата из документа.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
Вместо этого мы могли бы использовать общие методы:
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] Это говорит нам, что аргумент типа используется для полиморфизма; его единственный эффект - позволить использовать множество фактических типов аргументов на разных сайтах вызова. В таком случае следует использовать подстановочные знаки. Подстановочные знаки предназначены для поддержки гибкого выделения подтипов, что мы и пытаемся здесь выразить.
Разве мы не думаем, что wild card вроде (Collection<? extends E> c);
тоже поддерживает своего рода полиморфизм? Тогда почему использование универсальных методов в этом случае считается нецелесообразным?
Далее говорится:
Универсальные методы позволяют использовать параметры типа для выражения зависимостей между типами одного или нескольких аргументов метода и / или его возвращаемого типа. Если такой зависимости нет, не следует использовать общий метод.
Что это значит?
Они представили пример
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[...]
Мы могли бы написать сигнатуру этого метода другим способом, вообще без использования подстановочных знаков:
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
Документ не одобряет второе объявление и способствует использованию первого синтаксиса? В чем разница между первым и вторым объявлением? Кажется, оба делают одно и то же?
Может кто-нибудь зажечь эту зону.
?
. Вы можете переписать его как `public static <T1 extends Number, T2 extends Number> void copy (List <T1> dest, List <T2> src), и в этом случае станет очевидно, что происходит.