Несколько важных штук о дженериках:
1. Type erasure (стирание типов). Означает, что проверка соответствие типов в дженериках проводится исключительно на этапе компиляции. Далее данные о типах будут стёрты.
2. Как следствие type erasure, нельзя создать массив дженериков.
3. Дженерики не коваринтны.
4. При использовании wildcard (<?>, <? extends T>, <? super T>) стоит помнить о принципе PECS - Producer Extends Consumer Super. Этот принцип гласит:
Примеры производителя - коллекции, потребителя - предикаты.
5. Можно использовать множественные ограничения:
1. Type erasure (стирание типов). Означает, что проверка соответствие типов в дженериках проводится исключительно на этапе компиляции. Далее данные о типах будут стёрты.
List<Clever> geniuses = new ArrayList<>(); List<Stupid> losers = new ArrayList<>(); System.out.println(geniuses.getClass() == losers.getClass()); //true
2. Как следствие type erasure, нельзя создать массив дженериков.
class University<T> { T[] group = new T[30]; //error }
3. Дженерики не коваринтны.
List<Student> students = new ArrayList<>(); students = new ArrayList<Clever>(); //ошибка компиляции
4. При использовании wildcard (<?>, <? extends T>, <? super T>) стоит помнить о принципе PECS - Producer Extends Consumer Super. Этот принцип гласит:
Если метод имеет аргументы с параметризованным типом (например,Производитель и потребитель, кто это такие? Очень просто: если метод читает данные из аргумента, то этот аргумент —производитель, а если метод передаёт данные в аргумент, то аргумент является потребителем. Важно заметить, что определяя производителя или потребителя, мы рассматриваем только данные типа T.Collection<T>
илиPredicate<T>
), то в случае, если аргумент — производитель (producer), нужно использовать? extends T
, а если аргумент — потребитель(consumer), нужно использовать? super T
.
Примеры производителя - коллекции, потребителя - предикаты.
5. Можно использовать множественные ограничения:
class University<T extends Student & Serializable>
Комментариев нет:
Отправить комментарий