Records та Дженерики
27 питань і відповідей у розділі Records та Дженерики.
Питання цього розділу
- Що таке Record в Java і з якої версії вони доступні
- У чому основні відмінності Record від звичайного класу
- Чи можна наслідуватися від Record або наслідувати Record від іншого класу
- Чи можна додавати додаткові методи в Record
- Які методи автоматично генеруються для Record
- Чи можна перевизначити конструктор в Record
- Що таке компактний конструктор (compact constructor) в Record
- Чи можна оголошувати статичні поля та методи в Record
- Чи є поля Record фінальними
- Чи можна використовувати Record як ключ в HashMap
- Що таке дженерики (Generics) в Java
- У чому переваги використання дженериків
- Що таке type erasure (стирання типів)
- Чи можна створити масив дженерик-типу
- Що таке bounded type parameters
- У чому різниця між <? extends T> і <? super T>
- Що таке PECS (Producer Extends Consumer Super)
- Чи можна використовувати примітивні типи як параметри дженериків
- Що таке raw types і чому їх слід уникати
- Що станеться при спробі створити екземпляр дженерик-типу через new T()
- [У чому різниця між List<?> і List
- Чи можна перевантажувати методи, що відрізняються лише дженерик-параметрами
- Що таке recursive type bound
- Як працюють дженерики з наслідуванням
- Що таке bridge methods і навіщо вони потрібні
- Чи можна використовувати кілька обмежень (bounds) для одного параметра типу
- Як реалізувати шаблон Singleton за допомогою Record
Навігатор по розділу
27 питань для підготовки до співбесіди на Middle Java Developer.
📋 Всі питання
🗺️ Карта залежностей тем
┌──────────────────────────────────────────┐
│ 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 |
🔴 Рівень 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
- 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми