Дженерики в Java


Q&A по теме


Q&A по теме «Дженерики в Java» (собеседования)
Документ предназначен для повторения и систематизации знаний по дженерикам в Java.
Уровень: junior → middle.
1. Назначение дженериков
Вопрос: Зачем в Java используются дженерики?
  • Чтобы увидеть ответ, нужно нажать тут
примеры:
// До Java 5
List list = new ArrayList();
list.add("text");
Integer value = (Integer) list.get(0); // ошибка времени выполнения
// С дженериками
List<String> list = new ArrayList<>();
Integer value = list.get(0); // ошибка компиляции
Вопрос: Что такое параметрический полиморфизм?
*ответ тут*
2. Параметры типа
Вопрос: Что означает T в class Box<T>?
*ответ тут*
Вопрос: Имеют ли обозначения T, E, K, V специальное значение?
*ответ тут*
3. Type erasure
Вопрос: Что такое type erasure?
*ответ тут*
Вопрос: Почему в Java выбрана реализация через type erasure?
*ответ тут*
Вопрос: Можно ли получить информацию о параметре типа в runtime?
*ответ тут*
4. Инвариантность дженериков
Вопрос: Почему List<Child> не является подтипом List<Parent>?
*ответ тут* 
Вопрос: Почему массивы ковариантны, а дженерики — нет?
*ответ тут*
5. Wildcards
Вопрос: Что означает List<? extends Number>?
*ответ тут*
Вопрос: Что означает List<? super Integer>?
*ответ тут* 
Вопрос: Что такое правило PECS?
*ответ тут*
6. Ограничения параметров типа
Вопрос: Что означает T extends Number?
*ответ тут*
Вопрос: Можно ли задать несколько ограничений?
*ответ тут*
class Box<T extends Number & Comparable<T>> {}
7. Raw types
Вопрос: Что такое raw type?
*ответ тут*
Вопрос: Почему raw types считаются плохой практикой?
*ответ тут*
8. Обобщённые методы
Вопрос: Что такое обобщённый метод?
*ответ тут*
static <T> T first(List<T> list) {
    return list.get(0);
}
9. Общие вопросы
Вопрос: Можно ли использовать примитивы в дженериках?
*ответ тут*
Вопрос: Можно ли перегрузить методы, отличающиеся только параметрами дженериков?
*ответ тут*