У меня есть пара вопросов об общих подстановочных знаках в Java:
В чем разница между
List<? extends T>
иList<? super T>
?Что такое ограниченный шаблон и что такое неограниченный шаблон?
java
generics
bounded-wildcard
Пабло Фернандес
источник
источник
Ответы:
В вашем первом вопросе
<? extends T>
и<? super T>
приведены примеры ограниченных подстановочных знаков. Неограниченный подстановочный знак выглядит<?>
и в основном означает<? extends Object>
. Это примерно означает, что общий тип может быть любого типа. Ограниченный подстановочный знак (<? extends T>
или<? super T>
) накладывает ограничение на тип, говоря, что он либо должен расширять определенный тип (<? extends T>
известный как верхняя граница), либо должен быть предком определенного типа (<? super T>
известен как нижняя граница) .Учебные пособия по Java содержат довольно хорошее объяснение универсальных шаблонов в статьях « Подстановочные знаки» и « Еще больше удовольствия с подстановочными знаками» .
источник
<? super C>
будет означать, что ваш тип ограничен чем-то вышеC
в иерархии типов. (Извините за очень поздний ответ. Думаю, у нас не было уведомлений о комментариях 2 года назад?)Если у вас есть иерархия классов A, B является подклассом A, а C и D оба являются подклассом B, как показано ниже
затем
Ограниченный подстановочный знак похож на то, что
? extends B
B - некоторый тип. То есть тип неизвестен, но на него можно поставить "привязку". В этом случае он ограничен некоторым классом, который является подклассом B.источник
List<? super B>
описывает, как List принимает тип, который является родительским классом класса B ? Вот почему C и D не компилируются?У Джоша Блоха также есть хорошее объяснение того, когда использовать,
super
иextends
в этом видео-разговоре google io он упоминает мнемонику Producerextends
Consumersuper
.Из слайдов презентации:
источник
Могут быть моменты, когда вы захотите ограничить типы типов, которые разрешено передавать параметру типа. Например, метод, который работает с числами, может хотеть принимать только экземпляры Number или его подклассов. Для этого нужны параметры ограниченного типа.
означает, что он может принимать все объекты, которые имеют отношения IS- A с MyObject (т.е. любой объект, который является типом myObject, или мы можем сказать любой объект любого подкласса MyObject) или объект класса MyObject.
Например:
Затем,
будет принимать только MyObject или дочерние объекты MyObject (т.е. любой объект типа OurObject, YourObject или MyObject, но не любой объект суперкласса MyObject).
источник
В основном,
Чтобы поместить элементы в структуру нужен другой вид шаблона с именем
Wildcards with super
,источник
Общие подстановочные знаки созданы, чтобы сделать методы, работающие с Collection, более пригодными для повторного использования.
Например, если у метода есть параметр
List<A>
, мы можем передать его толькоList<A>
этому методу. При некоторых обстоятельствах это бесполезно для работы этого метода :List<A>
, тогда нам должно быть разрешено передаватьList<A-sub>
этому методу. (Потому что A-sub ЯВЛЯЕТСЯ A)List<A>
, тогда нам должно быть разрешено передаватьList<A-super>
этому методу. (Потому что А-супер)источник