Как объяснить назначение дженериков в Java простыми словами?
Что проверяют
Умеете ли вы объяснить сложное просто и не путаетесь ли в деталях за этим простым объяснением. Следом почти всегда идут стирание типов и вопрос про ? extends и ? super.
Как отвечать
Начните с аналогии в одну фразу: дженерик это коробка с подписью. В List<String> компилятор не даст положить число и не заставит приводить тип, когда достаёте. Дальше конкретика:
- проверка при компиляции: до Java 5 коллекции хранили
Object, и ошибка типа всплывала в рантайме какClassCastException. С параметром типа та же ошибка ловится компилятором; - без ручных приведений:
String s = list.get(0)вместо(String) list.get(0); - переиспользование: один
Box<T>или метод<T extends Comparable<T>> T max(List<T> list)работает для любых подходящих типов, а ограничениеextendsописывает, что от типа требуется; - стирание типов: параметры существуют только для компилятора, в рантайме
List<String>иList<Integer>это один класс. Поэтому нельзя написатьnew T(),new T[]илиT.class, а примитивы в параметр не подставить, отсюда автоупаковка вList<Integer>; - вариантность:
List<Integer>не подтипList<Number>. Гибкость дают wildcard по правилу PECS:? extends Tдля чтения (producer),? super Tдля записи (consumer), как вCollections.copy(List<? super T> dest, List<? extends T> src).
Упомяните сырые типы вроде голого List: они оставлены для совместимости, отключают проверки и дают предупреждения компилятора.
Где спотыкаются
Говорят, что дженерики «проверяют тип в рантайме». Проверка идёт только при компиляции, и через сырой тип или непроверенное приведение в List<String> легко положить Integer, который взорвётся позже, при чтении. Это называется heap pollution.
Считают, что раз Integer наследник Number, то List<Integer> можно передать туда, где ждут List<Number>. Не скомпилируется, и если вы не объясните, почему это правильно, следом спросят про массивы и ArrayStoreException.
Отвечают определением из учебника без примера. Просьба «простыми словами» проверяет именно умение объяснить: одна аналогия, один пример кода, одна оговорка про стирание.