Что дают дженерики при работе с коллекциями?
- Зачем нужны дженерики?
- Что такое raw type?
Дженерики переносят проверку типов на этап компиляции и убирают ручные приведения при чтении.
- Без них коллекция хранит Object: ClassCastException всплывает в рантайме, далеко от места ошибки
- Сырые типы (
Listбез параметра) — наследие, компилятор предупреждает
А ещё В рантайме параметр стёрт: тип элементов неизвестен, примитивы не поддерживаются
Подробно
До Java 5 коллекции хранили Object. Положить туда можно было что угодно, а при чтении требовалось приведение (String) list.get(0). Если кто-то положил число, ошибка ClassCastException вылетала при чтении — часто совсем в другом месте программы.
С дженериками List<String>:
- компилятор не даст положить не строку;
- при чтении приведение не нужно — тип известен;
- код сам себя документирует: видно, что лежит в коллекции.
Дженерики используют не только в коллекциях: Optional<T>, Comparator<T>, собственные обобщённые классы и методы (<T> T first(List<T> list)).
Сырые типы — List без параметра — оставлены для совместимости со старым кодом. Их использование отключает проверки, компилятор предупреждает.
Ограничение: параметр типа стирается при компиляции, поэтому в рантайме тип элементов недоступен, а примитивы как параметр не поддерживаются.
Пример
List raw = new ArrayList(); // сырой тип
raw.add(42);
String s = (String) raw.get(0); // ClassCastException во время выполнения
List<String> names = new ArrayList<>();
// names.add(42); // ошибка компиляции
String first = names.get(0); // без приведенияЧто хотят услышать
- Проверка типов при компиляции вместо ошибок в рантайме.
- Отсутствие приведений при чтении.
- Сырые типы и их опасность.
- Ограничения из-за стирания — плюс.
Частые ошибки
- Ожидать выигрыша в производительности от параметризации.
- Рассчитывать узнать параметр типа во время выполнения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Проверку типов при компиляции и чтение без приведений
- ✗Ускорение коллекций за счёт специализации кода под каждый тип
- ✗Возможность хранить примитивные типы без упаковки
- ✗Автоматическую синхронизацию доступа к элементам
Что спросят дальше
- Что такое стирание типов и к чему оно приводит?
- Почему нельзя написать List<int>?
Разбор темы
- Дженерики и стирание типов
Типобезопасность на компиляции, механизм type erasure и его последствия, дженерик-методы, ограниченные параметры и опасность raw types.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.