[Java] Вопрос по генерикам образовался
В Java есть подстановочные типы (wildcard type) и обобщенные классы (generic class). Первые выглядят примерно так <? [extends| super someClass]>, а вторые так <T [extends someClass]>.
По ходу у меня возникло несколько вопросов:
1) Насколько я понял из книжки Хорстмана они вообщем дублируют друг друга, позволяя писать независимый от типа код. Но не ясно какие у них отличия и в каких случаях лучше использовать подстановочные типы, а в каких обобщенные классы.
2) Зачем в случае подстановочных типов введены ограничения на супертипы <? super someClass> и подтипы <? extends someClass>, почему не реализовано аналогично «восходящему преобразованию» в обобщенных классах <T [extends someClass]> (т.е. почему нельзя читать и писать одной конструкцией)?
3) В разных изданиях Хорстманн описывает разное поведение подстановочных типов с ограничением на супертипы
For example, Pair<? super Manager> has methods
The compiler doesn’t know the exact type of the setFirst method but can call it with any object of type Manager, Employee, or Object, but not a subtype such as Executive.void setFirst(? super Manager) ? super Manager getFirst()
Это противоречит его более раннему изданию, где в setFirst можно передавать Manager и Executive, но не их супертипы.
Одновременно у Эккеля аналогичная цитата:
the argument is now a List<? super T>, so the List holds a specific type that is derived from T; thus it is safe to pass a T or anything derived from T as an argument to List methods.
Кому, собственно верить?
4) Какая практическая польза от неограниченных подстановочных типов <?>? Я пока не вижу никакой, кроме проверки на null: с ними нельзя выполнять никаких других операций.