Sobes.tech
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 ClassCastException xatolarini olib tashlaydi.
  • Yaxshiroq o'qilishi: Kod aniqroq bo'ladi, chunki u qaysi turlar bilan ishlashini ko'rsatadi.

Misollar:

  • List<T> konteyner sinfi har qanday T turidagi 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, ArrayList yoki 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. T ning subtiplari bilan ishlashga imkon beradi. T yoki uning supertiplaridagi elementlarni o'qish mumkin, yozish mumkin emas (null bundan mustasno).
  • <? super T>: Pastki cheklov. T yoki uning supertiplari bilan ishlashga imkon beradi. Elementlarni yozish mumkin, lekin o'qishda faqat Object qaytariladi.

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
}