3-modul · 2-dars: Generics
Daraja: O'rta
Generics. Exception va Collections bo‘yicha nazariya, amaliy namuna va mustaqil mashq.
Tushuntirish
## Dars maqsadi Generics tushunchalarini farqlash, nima uchun kerakligini izohlash va kichik misolda qo‘llash.
## Nazariya Class, interface va methodlarni tur (type) parametri bilan yozish imkoni — masalan `List<String>`. Turni parametrlashtiradi.
Compile vaqtida tur xavfsizligi, keraksiz cast dan xalos bo'lish va kodni qayta ishlatish.
## Intervyuga tayyorgarlik ### Generiklar nima? Class, interface va methodlarni tur (type) parametri bilan yozish imkoni — masalan `List<String>`. Turni parametrlashtiradi.
### Generiklarning foydali tomonlari? Compile vaqtida tur xavfsizligi, keraksiz cast dan xalos bo'lish va kodni qayta ishlatish.
### Generiklarni qayerlarda e'lon qila olamiz? Class, interface, method va constructor darajasida.
### Generic va Object o'rtasida nima farqi bor? Object bilan cast kerak va xato faqat runtime da chiqadi. Generic bilan tur compile vaqtida tekshiriladi, cast kerak emas.
### Single Bounds nima? Tur parametrini bitta yuqori chegara bilan cheklash: `<T extends Number>`.
### Bound Typelardan nima uchun foydalanamiz? Tur parametrini muayyan class/interface bilan cheklab, uning methodlaridan foydalanish uchun.
### Qanday Bounds turlari bor? Upper bound (`extends`) va lower bound (`super`, wildcard da); shuningdek single va multiple bounds.
### Multiple Bounds nima? Bir necha chegara: `<T extends Number & Comparable<T>>` (avval class, keyin interfacelar).
### Type Erasure nima? Kompilyatsiyada generic tur ma'lumoti o'chiriladi (bytecode da `Object` yoki bound ga almashadi). Runtime da generic tur mavjud emas.
### Type Erasure methodda ham sodir bo'ladimi? Ha, generic method parametrlari ham erase bo'lib, bound (yoki `Object`) ga almashadi.
### Raw type nima? Generic classni tur parametrisiz ishlatish: `List list = new ArrayList();`. Eski kod bilan moslik uchun, lekin xavfsiz emas.
### Warnings nima? Kompilyatorning «unchecked» kabi ogohlantirishlari — xato emas, lekin xavf (masalan raw type ishlatilganda).
### Raw typelarni ishlatishdan nima uchun qochish kerak? Tur xavfsizligi yo'qoladi va runtime da `ClassCastException` xavfi paydo bo'ladi.
### Generiklarda qanday cheklovlar mavjud? Primitive tur parametri bo'lolmaydi; `new T()` yaratib bo'lmaydi; generic array yaratib bo'lmaydi; static field generic bo'lolmaydi; `instanceof` generic tur bilan ishlamaydi.
### Generiklarda vorislik bilan ishlaganda qanday qoida bor? `List<String>` `List<Object>` ning subtype-i EMAS (invariant). Moslashuv uchun wildcard (`? extends`, `? super`) kerak.
### SuperClass typedagi arrayga subclass arrayini o'zlashtira olamizmi? Array-larda ha (covariant): `Object[] a = new String[3];`. Lekin bu runtime da `ArrayStoreException` xavfini keltiradi; generiklar esa buni taqiqlaydi.
## Versiya va aniqlik Java misollari Java 17 bazasiga mo‘ljallangan. JDK/JRE paketlash usuli distributivga bog‘liq; JVM bayt-kodni interpretatsiya va JIT orqali bajarishi mumkin. GC uchun aniq bajarilish vaqtiga kafolat yo‘q; finalization resurs yopish usuli emas. Thread stop/suspend/resume kabi eski metodlar amaliy yechim emas. Koddagi import, klass yoki tashqi kutubxona kontekstini tekshiring.
## Manbalar [Moduldagi savollar yo‘nalishi](https://github.com/jlkesh/pdp_online_java_lessons/blob/main/interviewquestions/3-module.md) [Rasmiy qo‘llanma](https://dev.java/learn/api/collections-framework/) [Sizning avvalgi savol-javob arxivingiz](https://lightyer.uz/java/interview.html)
Kod quyida o‘quv namunasi sifatida berilgan. To‘liq ilova uchun import, dependency va konfiguratsiya kerak bo‘lishi mumkin. SQLni faqat ajratilgan test bazasida bajaring.
Kod misoli
record Box<T>(T value) {}
// Box<String> box = new Box<>("Java");
// String value = box.value();
Keng tarqalgan xatolar
- Generik o'rniga `Object` ishlatib, keyin cast qilish - xato runtime ga suriladi.
- Runtime da generik turni bilishga urinish - type erasure sabab u o'chib ketgan.
Mashqlar
- Generik `Box<T>` class yozib, uni ikki xil tur bilan ishlating.
- `List<Object>` ga `List<String>` berishga urinib, kompilyator xabarini tushuntiring.
Teglar: nazariya, modul-03, pdp