Раздел 20 · 27 вопросов

Records и Дженерики

27 вопросов и ответов в разделе Records и Дженерики.

Russian Records и Дженерики Исходный Markdown
Версии по языкам: English Russian Ukrainian

Вопросы этого раздела

  1. Что такое Record в Java и с какой версии они доступны
  2. В чём основные отличия Record от обычного класса
  3. Можно ли наследоваться от Record или наследовать Record от другого класса
  4. Можно ли добавлять дополнительные методы в Record
  5. Какие методы автоматически генерируются для Record
  6. Можно ли переопределить конструктор в Record
  7. Что такое компактный конструктор (compact constructor) в Record
  8. Можно ли объявлять статические поля и методы в Record
  9. Являются ли поля Record финальными
  10. Можно ли использовать Record как ключ в HashMap
  11. Что такое дженерики (Generics) в Java
  12. В чём преимущества использования дженериков
  13. Что такое type erasure (стирание типов)
  14. Можно ли создать массив дженерик-типа
  15. Что такое bounded type parameters
  16. В чём разница между <? extends T> и <? super T>?
  17. Что такое PECS (Producer Extends Consumer Super)
  18. Можно ли использовать примитивные типы как параметры дженериков
  19. Что такое raw types и почему их следует избегать
  20. Что произойдёт при попытке создать экземпляр дженерик-типа через new T()
  21. [В чём разница между List<?> и List?](./21-what-is-the-difference-between-list-and-list-object/)
  22. Можно ли перегружать методы, отличающиеся только дженерик-параметрами?
  23. Что такое recursive type bound
  24. Как работают дженерики с наследованием
  25. Что такое bridge methods и зачем они нужны
  26. Можно ли использовать несколько ограничений (bounds) для одного параметра типа?
  27. Как реализовать шаблон Singleton с помощью Record

Навигатор по разделу

27 вопросов для подготовки к собеседованию на Middle Java Developer.


📋 Все вопросы

# Вопрос Уровень сложности
1 Что такое Record в Java и с какой версии они доступны
2 В чём основные отличия Record от обычного класса
3 Можно ли наследоваться от Record
4 Можно ли добавлять дополнительные методы в Record ⭐⭐
5 Какие методы автоматически генерируются для Record ⭐⭐
6 Можно ли переопределить конструктор в Record ⭐⭐
7 Что такое компактный конструктор (compact constructor) в Record ⭐⭐
8 Можно ли объявлять статические поля и методы в Record
9 Являются ли поля Record финальными
10 Можно ли использовать Record как ключ в HashMap ⭐⭐
11 Что такое дженерики (Generics) в Java
12 В чём преимущества использования дженериков
13 Что такое type erasure (стирание типов) ⭐⭐⭐
14 Можно ли создать массив дженерик-типа ⭐⭐
15 Что такое bounded type parameters ⭐⭐
16 В чём разница между <? extends T> и <? super T> ⭐⭐⭐
17 Что такое PECS (Producer Extends Consumer Super) ⭐⭐⭐
18 Можно ли использовать примитивные типы как параметры дженериков
19 Что такое raw types и почему их следует избегать ⭐⭐
20 Что произойдёт при попытке создать экземпляр дженерик-типа через new T() ⭐⭐
21 [В чём разница между List<?> и List](./21-what-is-the-difference-between-list-and-list-object/) ⭐⭐
22 Можно ли перегружать методы, отличающиеся только дженерик-параметрами ⭐⭐⭐
23 Что такое recursive type bound ⭐⭐⭐
24 Как работают дженерики с наследованием ⭐⭐
25 Что такое bridge methods и зачем они нужны ⭐⭐⭐
26 Можно ли использовать несколько ограничений (bounds) для одного параметра типа ⭐⭐⭐
27 Как реализовать шаблон Singleton с помощью Record ⭐⭐

🗺️ Карта зависимостей тем

                    ┌──────────────────────────────────────────┐
                    │   RECORDS (1-10)                         │
                    │   1. Что такое Record (Java 16)           │
                    │   2. Record vs обычный класс              │
                    │   3. Наследование (нельзя)                │
                    │   4. Дополнительные методы                │
                    │   5. Автогенерация методов                │
                    │   6. Конструкторы                         │
                    │   7. Compact constructor                  │
                    │   8. Static поля и методы                 │
                    │   9. Final поля                           │
                    │   10. Record как ключ HashMap             │
                    └──────────────────┬───────────────────────┘
                                       │
            ┌──────────────────────────┼──────────────────────────┐
            ▼                          ▼                          ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ GENERICS       │        │ WILDCARDS      │        │ ADVANCED           │
    │ BASICS         │        │ И ERASURE      │        │ GENERICS           │
    │ (11-12, 18)    │        │ (13-14, 19-21) │        │ (22-26)            │
    │ 11. Generics   │        │ 13. Erasure    │        │ 22. Overloading    │
    │ 12. Преимущества│       │ 14. Generic    │        │ 23. Recursive bound│
    │ 18. Primitives │        │     arrays     │        │ 24. Наследование   │
    │                │        │ 19. Raw types  │        │ 25. Bridge methods │
    │                │        │ 20. new T()    │        │ 26. Multiple bounds│
    │                │        │ 21. List<?> vs │        │                    │
    │                │        │     List<Obj>  │        │                    │
    └───────┬───────┘        └───────┬───────┘        └────────┬───────────┘
            │                        │                        │
            └────────────────────────┼────────────────────────┘
                                     ▼
                    ┌──────────────────────────────────────────┐
                    │   PATTERNS (15-17, 27)                   │
                    │   15. Bounded type parameters            │
                    │   16. extends T vs super T               │
                    │   17. PECS                               │
                    │   27. Singleton with Record              │
                    └──────────────────────────────────────────┘

🎯 Рекомендуемый порядок изучения

🟢 Уровень Junior (недели 1-2)

Шаг Тема Файлы Цель
1 Records база Q1-Q3 Что такое Record, отличия от класса, нельзя наследовать
2 Record методы Q4, Q5, Q8, Q9 Доп. методы, автогенерация, static, final
3 Generics база Q11, Q12 Что такое generics, зачем нужны
4 Primitives Q18 Autoboxing overhead, почему нельзя примитивы

🟡 Уровень Middle (недели 3-4)

Шаг Тема Файлы Цель
1 Record конструкторы Q6, Q7 Переопределение, compact constructor
2 Record + HashMap Q10 Почему Record идеальны как ключи
3 Type Erasure Q13, Q14 Как работает стирание, массивы generics
4 Bounded types Q15, Q19 Ограничения типов, raw types
5 Wildcards Q21, Q20 List<?> vs List, new T()

🔴 Уровень Senior (недели 5-6)

Шаг Тема Файлы Цель
1 PECS Q16, Q17 Producer Extends, Consumer Super
2 Overloading Q22 Нельзя перегрузить по generics
3 Recursive bounds Q23 Comparable<? super T>, CRTP
4 Inheritance + Generics Q24 Covariant returns, generics invariance
5 Bridge methods Q25 Зачем нужны, как генерируются
6 Multiple bounds Q26 Intersection types, erasure первого bound

🔗 Ключевые связи между темами

Тема: Records

Q1 (Record) → Q2 (vs обычный класс) → Q3 (наследование)
     ↓
Q4 (Доп. методы) → Q5 (Автогенерация) → Q6 (Конструкторы) → Q7 (Compact)
     ↓
Q8 (Static) → Q9 (Final) → Q10 (HashMap key)

Тема: Generics Basics

Q11 (Generics) → Q12 (Преимущества) → Q18 (Primitives)

Тема: Erasure и Wildcards

Q13 (Type Erasure) → Q14 (Generic arrays) → Q19 (Raw types) → Q20 (new T()) → Q21 (List<?> vs List<Object>)

Тема: PECS

Q15 (Bounded types) → Q16 (extends vs super) → Q17 (PECS)

Тема: Advanced

Q22 (Overloading) → Q23 (Recursive bound) → Q24 (Наследование) → Q25 (Bridge methods) → Q26 (Multiple bounds)

🎓 Шпаргалка: что знать для каждого уровня

🟢 Junior

  • Record = immutable data class, Java 16+
  • Автоматически: конструктор, аксессоры, equals/hashCode/toString
  • Нельзя наследовать, нельзя instance поля (только static)
  • Generics = параметризация типов, compile-time type safety
  • Примитивы нельзя в generics — autoboxing в обёртки

🟡 Middle

  • Compact constructor: без сигнатуры, только валидация
  • Type erasure: generics существуют только на compile-time, runtime = Object
  • Raw types — backwards compatibility, но unchecked warnings
  • <? extends T> = read-only (producer), <? super T> = write (consumer)
  • new T() невозможен — type variable не имеет конструктора

🔴 Senior

  • PECS: Producer Extends, Consumer Super
  • Bridge methods: компилятор генерирует для covariant returns после erasure
  • Multiple bounds: <T extends A & B> — erasure по первому bound
  • Generic arrays невозможны — heap pollution risk
  • List НЕ подтип List — generics инвариантны
  • Recursive bound: T extends Comparable<? super T> для наследуемого compareTo

📝 Формат каждого файла

Каждый файл содержит:

  • 🟢 Junior Level — базовое понимание, простые аналогии, примеры
  • 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
  • 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы