О generics

Дополнительную гибкость использования generic-ов придаёт возможность уточнить (ограничить) те типы, которые могут быть использованы при подстановке. Для этого используются так
называемые подстановки (wildcards). Синтаксически они представляются знаком вопроса ( ? ).
Существуют:
— “неограниченные” подстановки ( например, List<?> l = new ArrayList<String>() )
— подстановки, ограниченные сверху ( например, List<? extends Exception> l = new
ArrayList<RuntimeException>(); )
— подстановки, ограниченные снизу ( например, List<? super Exception> l =new
ArrayList<Object>(); )
Также в подстановках возможно объявлять интерфейсы, причём используя ключевое слово
extends, а не implements (например, List<? extends Comparable> l = new ArrayList<String>()).
Ещё раз:
— одна из основных задач использования Generic-ов – обеспечении типобезопасности и
предупреждение даже потенциальных ошибок приведения типов на этапе компиляции
— в runtime generic нет


Подробнее о подстановках:
“неограниченные” подстановки ( кстати, чем отличаются от подстановок, ограниченных снизу ? ) –(см. пример Unbounded) Этот пример не скомпилируется, когда в аргументе метода указан
конкретный тип (в данном случае Object) , так как присутствует вероятность RuntimeException.
подстановки, ограниченные сверху (см. пример UpperBounded) Плюс в том, что при таком ограничении множества типов для подстановки можно точно указать компилятору, какие методы/константы можно вызывать у параметризированного аргумента (если речь о методе).
Примечательно, что в коллекцию, в которой тип элементов объявлен с использованием такого типа подстановок, нельзя добавлять элементы (за исключением null, то есть list.add(null) скомпилируется ).
подстановки, ограниченные снизу (см. пример LowerBounded) В коллекцию, в которой тип элементов объявлен с использованием такого типа подстановки, можно добавлять элементы, которые совместимы с “нижним” классом по правилу полиморфизма (то есть являются инстансами либо этого класса, либо его потомков). Но в этом случае нет того плюса, который есть при подстановках, ограниченных сверху.
Подстановки <?> могут быть использованы только для ссылок, но не для параметра типа при создании новой типизированной коллекции, при использовании new тип должен быть указан
точно. Так же и при использовании generic в методах тип возвращаемого значения должен быть указан точно. См. someexamples/Examples

Назад

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *