Розділ 20 · 27 питань

Records та Дженерики

27 питань і відповідей у розділі Records та Дженерики.

Ukrainian 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 Не можна перевантажити за дженериками
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
  • 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми