Смотрите Действующая Java 2-е издание, пункт 28:
PECS
Producer extends, Consumer super
Если ваш параметр является производителем, то он должен быть расширяет T>
, если это потребитель, то он должен быть super T>
.
Взгляните на Коллекции Google, они знают, как им пользоваться, потому что у них есть Bloch ;)
.Это зависит от того, какой путь в иерархии наследования он позволяет. Предположим, у вас есть класс «Child», который наследуется от «Parent», который наследуется от «Grandparent».
принимает либо Parent, либо Child, а
принимает либо родитель, либо бабушка или дедушка.
Существует три типа подстановочных знаков:
? extends Type
: обозначает семейство подтипов типа Type
. Это самый полезный подстановочный знак. ? super Type
: обозначает семейство супертипов типа Type
. ?
: обозначает набор всех типов или любых. Если вы спрашиваете о параметрах типа, то в Java нет конструкции
. Ограниченный параметр может расширять только
, но он может расширять более одного типа. Например,
public class MyClass< T extends Closeable & Runnable >
{
// Closeable and Runnable are chosen for demonstration purposes only
}
В этом случае, если вы видите MyClass
, тогда ConcreteT должен быть объявлен как
public class ConcreteT
implements Closeable, Runnable
{
...
}
. Для ограниченных подстановочных знаков прочтите эту статью . Прочтите раздел о принципе получения . В основном, super
соответствует семантике write
, а extends
соответствует семантике read
.
Remember PECS - Producer Extends Consumer Support. Also, uncle Bob discusses it well in his craftsman series. Check out http://objectmentor.com/resources/articles/The_Craftsman_44__Brown_Bag_I.pdf