2012-06-22 3 views
2

Может кто-нибудь объяснить мне разницу между extends и super в java generics с помощью подстановочных знаков?java generics с подстановочными знаками

Я прочитал связанные сообщения и не получил полного понимания. Если бы вы могли объяснить мне пример в реальном времени, это было бы большой помощью для меня.

Что делает PECS (продюсер, который вы продлеваете, потребляет вы используете супер)?

+2

Возможно, вы хотите прочитать следующее: http://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.html –

ответ

1

Тип параметра <? extends T > означает T или любой подкласс T.

Тип параметра <? супер Т > означает Т или любой суперкласс T.

Например:

  • Iterable <? extends T > поддерживает любой итератор, метод next() которого возвращает T. Это включает итераторы, которые возвращают подкласс T.
  • Collection <? super T > поддерживает любую коллекцию, в которую можно разместить T. Это включает в себя коллекции, которые могут содержать объекты любого суперкласса Т.

В Effective Java, Джошуа Блох рекомендует мнемонические PECS - для «Производитель-Расширяет, Потребительское-Супер».

"Если параметризованный тип представляет производитель T, используйте <? extends T>; , если она представляет собой Т-потребитель, использовать <? super T>."

Это также известно как Получить и положить принцип, из Java дженериков Мориса Нафталина и Филипп Уодлером.

«Использовать extends подстановочные, когда вы только получить значения из структуры, используйте super подстановочные, когда вы только поместить значения в структуру, и не использовать подстановочные знаки, когда вы как получить и положить ».

3

Если у вас есть классы A, B и C, где

А продолжается Аргументы B

и

B расширяет C

Тогда

A и B матча:

? простирается Б

и

В и С матча:

? super B