в чем разница между 'super' и 'extends' в Java Generics [дубликат]
этот вопрос уже есть ответ здесь:
Я пытаюсь изучить Java дженерики. Я не понимаю, когда вы будете использовать <T extends Foo> и когда вы будете использовать <T super Foo>. Что каждая из этих вещей означает о T? Допустим, у меня есть <T extends Comparable> и <T super Comparable>, что означает каждый из них?
Я прочитал несколько учебников на sun.com но я все равно заблудился. Может кто-нибудь проиллюстрировать на примерах?
спасибо!
6 ответов:
см. эффективное Java 2-е издание, пункт 28:
Печ
Producer extends, Cпотребителям sупер
Если ваш параметр является производителем, он должен быть!--0-->, Если это потребитель, он должен быть
<? super T>.взгляните на коллекции Google, они знают, как использовать его, потому что они получили блох;)
это зависит от того, какой путь наследования иерархии он позволяет. Предположим, у вас есть класс "Child", который наследует от "Parent", который наследует от "Grandparent".
<T extends Parent>принимает либо родителя, либо ребенка в то время как<T super Parent>принимает либо родителей, либо бабушек и дедушек.
есть три типа шаблонов:
? extends Type: обозначает семейство подтипов типаType. Это самый полезный символ.? super Type: обозначает семейство супертипов типаType.?: обозначает набор всех типов или любой.
для меня лучший ответ пришел от @BSingh, когда я прочитал статью дяди Боба. Я возобновляю здесь, заключение статьи.
Использовать Listсупер костюм> всякий раз, когда вы собираетесь написать в список.
когда вы помещаете объект в список, все, что вас волнует, это то, что объект имеет тип, совместимый с типом, содержащимся в списке. Таким образом, вы хотите, чтобы список принимал тип этого объекта или любого из суперклассов этот объект.
Использовать Listвыходит костюм> всякий раз, когда вы собираетесь читать из списка.
с другой стороны, когда вы читаете из списка, вы хотите, чтобы тип, который Вы читаете, был типом, содержащимся в списке, или производным от этого типа.
если вы спрашиваете о параметрах типа, то нет
<T super X>построить в Java. Ограниченный параметр может толькоextend, но он может расширить больше чем один тип. Напримерpublic class MyClass< T extends Closeable & Runnable > { // Closeable and Runnable are chosen for demonstration purposes only }в этом случае, если вы видите
MyClass< ConcreteT >тогда бетон должен быть объявлен какpublic class ConcreteT implements Closeable, Runnable { ... }для ограниченных подстановочных знаков, читать в этой статье. Читайте раздел на принцип get-put. В принципе,
superсоответствуетwriteсемантика, иextendsсоответствуетreadсемантика.
помните УИК-производитель расширяет поддержку потребителей. Кроме того, дядя Вася обсуждает это в своей серии мастер. Проверьте http://objectmentor.com/resources/articles/The_Craftsman_44__Brown_Bag_I.pdf
Comments