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
ClassCastExceptionsə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ıTtipli 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,ArrayLististifadə 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.Tvə 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.Tvə ya onun super tipləri ilə işləməyə imkan verir. Elementləri yaza bilərik, amma oxuyanda yalnızObjectalı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
}