О generics

Зачем вообще нужны generics ?
1. Для типобезопасности. До Java 5-й версии ошибки приведения типов были уделом runtime. То есть на этапе компиляции нельзя было отловить ошибку из примера (см. класс PreGeneric). Generics позволяют параметризировать типы данных, используемые в коде, то
есть указывать, данные какого типа мы хотим использовать в том или ином случае. Таким образом, ошибки приведения типов выносятся из runtine в compile time, что, конечно же, более удобно и экономит время.
2. Для более гибкого процесса разработки, то есть уход от жёсткого определения используемых типов там, где могут быть использованы разные типы (см. пример Account).

Generic обозначается как символ (либо набор символов), взятый (взятые) в квадратные скобки; если их несколько, то разделяются между собой запятыми (пример Account). Есть соглашения по наименованию generic-ов:
— E для элементов коллекций
— K для ключей в имплементациях интерфейса map
— V для значений в имплементациях интерфейса map
— T, U, V и тд для подстановки в класс, интерфейс (так как редко приходится писать свои map-ы либо коллекции, то это наиболее частый случай применения)

Generic применяется не только в классах, но и в интерфейсах. Способы взаимодействия класса с generic интерфейсом:
— Указать generic тип в классе (см. GenericTypeInTheClass), то есть тип generic-а в интерфейсе явно указывается при объявлении класса
— Сделать класс generic-ом (см. GenericClass), то есть объявляется generic-ом и тип generic-а (или нескольких) совпадает с типом generic-а в интерфейсе
Не только классы и интерфейсы могут быть generic-ами, но и отдельные методы тоже. То есть возможен вариант, что класс сам по себе не является generic, но содержит generic методы (см.
methods/Examples). Требование синтаксиса таково, что generic указывается перед типом возвращаемого методом значения. Чаще всего generic методы являются static, так как static контекст не относится к инстансу класса, при создании которого указываются конкретные типы.
Если класс является generic, то отдельно в методе тип указывать не надо.

ВАЖНО: В Runtime Generic-ов НЕТ ( это сделано для обратной совместимости кода, использующего generics, с кодом, соответствующим версиям Java до 5-й ). То есть все generic-и квалифицируются исполняющей системой Java как Object. Этот процесс называется Type Erasure (“удаление” типов).

Чего нельзя делать с generic-ами ?
— использовать в instanceof (из-за type erasure)

— вызывать конструктор (например, new T()) – в runtime будет new Object()
— использовать примитивный тип как параметр generic-а, использовать обёртку.
— использовать generic при объявлении статических переменных (так как конкретный тип задаётся при создании инстанса класса)

Вперед

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

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