Sobes.tech
Middle

Generics-də hansı imkanlar var?

sobes.tech Süni İntellekt

AI-dan cavab

Generics parametrik sinflər, interfeys və metodların yaradılmasına imkan verir.

Əsas imkanlar:

  • Kodun təkrar istifadəsi: Hər hansı bir tiplə işləyən ümumi məlumat strukturları və alqoritmlər yaratmaq.
  • Növ təhlükəsizliyi kompilyasiya zamanı: Növ səhvləri kompilyasiya mərhələsində aşkarlanır, icra zamanı deyil. Əl ilə növ çevirmələrinə və potensial ClassCastException səhvlərinə ehtiyac qalmır.
  • Daha yaxşı oxunaqlıq: Kod daha aydın olur, çünki hansı tiplərlə işlədiyini açıq göstərir.

Nümunələr:

  • List<T> konteyner sinfi hər hansı T tipli elementləri saxlaya bilər.
  • static <T> T getFirst(List<T> list) metodu hər hansı tiplə olan siyahının ilk elementini qaytara bilər.

Generics məhdudiyyətləri:

  • Ümumi tiplərin nümunələrini yaratmaq olmaz: new T().
  • Primitiv tiplər tip parametri kimi istifadə oluna bilməz (məsələn, List<int> - yanlışdır, List<Integer> istifadə olunmalıdır).
  • Generik tiplərin massivlərini birbaşa yaratmaq olmaz (məsələn, T[] array = new T[10] - yanlışdır, ArrayList istifadə edilməli və ya tip çevirmə edilməlidir).
  • Statik sahələr birbaşa generik tiplərlə istifadə oluna bilməz.
  • Tiplər haqqında məlumatlar işləmə zamanı silinir (Type Erasure), məhdud wildcards istisna olmaqla.

Wildcards və məhdud Tip Parametrləri:

  • <?>: Naməlum tipp. Elementləri oxumağa imkan verir, yazmağa yox.
  • <? extends T>: Yuxarı sərhəd. T-nin alt tipləri ilə işləməyə imkan verir. T və ya onun super tiplərindən elementləri oxumaq olar, amma yazmaq (null istisna olmaqla) mümkün deyil.
  • <? super T>: Aşağı sərhəd. T və ya onun super tipləri ilə işləməyə imkan verir. Elementləri yaza bilərik, amma oxuyanda yalnız Object alınır.

Nümunə:

// `Number`-ın alt tiplərini ehtiva edən hər hansı siyahıdan elementləri çap edən metod
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Kompilyasiya xətası
}

// Integer əlavə edə bilən metod
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Kompilyasiya xətası, Object qaytarır
}