Как стать автором
Обновить

Комментарии 5

Когда начал писать на Java — и узнал что есть конструкции ? extends T и ? super T — сразу попытался представить ситуации, где они могут быть полезны — и как-то естественно пришёл к таким интерфейсам.

Я бы сформулировал вместо PECS другой принцип (сокрытия реализации.) — «знай только необходимый минимум о типах передаваемых тебе параметров» — отсюда вытечет как использование extends так и super.
Не для всех это очевидно, к сожалению. :-)
У разных людей по-разному развита склонность к абстрактному мышлению.
И если человек специально не подумает об этом, то может и не прийти к аналогичным выводам.
Ага, вот пример, на который я нарвался в apache commons-configuration: issues.apache.org/jira/browse/CONFIGURATION-561.

Товарищи удачно мигрировали на Java 1.5+ (до этого была совместимость 1.4+, где generics ещё не было).

проблемный код
В API
public List getList(String key, List defaultValue)

поменялся на
public List<Object> getList(String key, List<Object> defaultValue)


И код вида
Configuration conf = ...; // some configuration
List<String> defaults = ...; // some default value

List<Object> value = conf.getList("id", defaults);

Теперь просто не соберется.


Сейчас это, конечно, исправлено.
Было бы неплохо в контексте статьи упомянуть такой термин, как "вариантность". Например, что параметр типа в конструкции <T> является инвариантным, в <? extends T>ковариантным, а в <? super T>контравариантным. А то много разработчиков слышали эти термины, но что именно они описывают — без понятия, хотя каждый знаком с их сутью. К тому же, во всяких блогах по ООП они, почему-то, в подавляющем большинстве объясняются на примерах из C#.
Вот тут Миша Ершов хорошо рассказал про совместимые API, в том числе, и про дженерификацию:
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.