Middle
Genericsda qanday imkoniyatlar mavjud?
sobes.tech AI
AIdan javob
Genericslar parametrli sinflar, interfeyslar va metodlarni yaratishga imkon beradi.
Asosiy imkoniyatlar:
- Kodni qayta ishlatish: Har qanday tur bilan ishlaydigan umumiy ma'lumotlar tuzilmalari va algoritmlar yaratish.
- Turlar xavfsizligi kompilatsiya vaqtida: Turlar xatolari kompilatsiya bosqichida aniqlanadi, ish vaqtida emas. Qo'lda tur o'tkazish va potentsial
ClassCastExceptionxatolarini olib tashlaydi. - Yaxshiroq o'qilishi: Kod aniqroq bo'ladi, chunki u qaysi turlar bilan ishlashini ko'rsatadi.
Misollar:
List<T>konteyner sinfi har qandayTturidagi elementlarni saqlay oladi.static <T> T getFirst(List<T> list)metodi har qanday turdagi ro'yxatdan birinchi elementni qaytarishi mumkin.
Generics cheklovlari:
- Umumiy turdagi nusxalar yaratib bo'lmaydi:
new T(). - Primitiv turlar parametr sifatida ishlatilmaydi (masalan,
List<int>- noto'g'ri,List<Integer>ishlatilishi kerak). - Generik turlar massivlarini to'g'ridan-to'g'ri yaratish mumkin emas (masalan,
T[] array = new T[10]- noto'g'ri,ArrayListyoki tur o'tkazish ishlatilishi kerak). - Statik maydonlar to'g'ridan-to'g'ri generik turlar bilan ishlatilmaydi.
- Turlar haqidagi ma'lumotlar ish vaqtida yo'qoladi (Type Erasure), cheklangan wildcards bundan mustasno.
Wildcards va cheklangan tur parametrlar:
<?>: Noma'lum tur. Elementlarni o'qishga imkon beradi, yozishga emas.<? extends T>: Yuqori cheklov.Tning subtiplari bilan ishlashga imkon beradi.Tyoki uning supertiplaridagi elementlarni o'qish mumkin, yozish mumkin emas (null bundan mustasno).<? super T>: Pastki cheklov.Tyoki uning supertiplari bilan ishlashga imkon beradi. Elementlarni yozish mumkin, lekin o'qishda faqatObjectqaytariladi.
Misol:
// Number ning subtiplarini o'z ichiga olgan har qanday ro'yxatdan elementlarni chiqaradigan metod
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(new Integer(1)); // Kompilatsiya xatosi
}
// Integer ni ro'yxatga qo'shishi mumkin bo'lgan metod
public static void addIntegers(List<? super Integer> list) {
list.add(new Integer(10));
// Integer val = list.get(0); // Kompilatsiya xatosi, Object qaytaradi
}