Я читаю про загальні методи з 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) { ... }
Документ відмовляє від другої декларації та сприяє використанню першого синтаксису? Яка різниця між першою та другою деклараціями? Здається, що обидва роблять те саме?
Чи може хтось поставити світло на цю область.
?
. Ви можете переписати його як "загальнодоступна статична <T1 розширює число, T2 розширює номер> недійсна копія (Список <T1> dest, Список <T2> src), і в цьому випадку стане очевидним, що відбувається.