Я читаю об общих методах из OracleDocGenericMethod. Я довольно запутался в сравнении, когда он говорит, когда использовать wild-card и когда использовать общие методы. Цитирование из документа.
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! }
[...] Это говорит нам, что аргумент типа используется для полиморфизма; его единственный эффект заключается в том, чтобы разрешить различные типы фактических аргументов используется на разных сайтах вызова. Если это так, нужно используйте подстановочные знаки. Подстановочные знаки предназначены для поддержки гибкого подтипирования, это то, что мы пытаемся выразить здесь.
Разве мы не считаем, что такая дикая карта, как (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) { ... }
Документ отклоняет второе объявление и способствует использованию первого синтаксиса? Какая разница между первой и второй декларацией? Оба, похоже, делают одно и то же?
Может ли кто-нибудь поставить свет на эту область.