Sobes.tech
Middle

Ի՞նչ հնարավորություններ կան Generics-ում։

sobes.tech AI

Պատասխան AI-ից

Գեներիկները թույլ են տալիս ստեղծել պարամետրային դասեր, ինտերֆեյսներ և մեթոդներ:

Հիմնական հնարավորությունները՝

  • Կոդի վերօգտագործում: Ստեղծել ընդհանուր տվյալների կառուցվածքներ և ալգորիթմներ, որոնք աշխատում են ցանկացած տիպի հետ:
  • Տիպի անվտանգություն կոմպիլյացիայի ժամանակ: Տիպի սխալները հայտնաբերվում են կոմպիլյացիայի փուլում, ոչ թե գործարկման ժամանակ: Սա վերացնում է ձեռքով տիպի փոխարկումների և հնարավոր սխալների անհրաժեշտությունը՝ ClassCastException:
  • Կարդալու բարելավված ընթեռնելիություն: Կոդը ավելի հստակ է, քանի որ հստակ ցույց է տալիս, թե ինչ տիպերի հետ է աշխատում:

Օրինակներ՝

  • List<T> դասը կարող է պահել ցանկացած T տիպի տարրեր:
  • static <T> T getFirst(List<T> list) մեթոդը կարող է վերադարձնել ցանկացած տիպի առաջին տարր:

Գեներիկների սահմանափակումներ:

  • Չի կարելի ստեղծել գեներիկ տիպի օրինակներ՝ new T():
  • Չի կարելի օգտագործել հիմնական տիպեր որպես տիպի պարամետրեր՝ օրինակ, List<int> սխալ է, պետք է լինի List<Integer>:
  • Չի կարելի ուղղակի ստեղծել գեներիկ տիպի զանգվածներ՝ օրինակ, T[] array = new T[10] սխալ է, պետք է օգտագործել ArrayList կամ տիպի փոխարկում:
  • Չի կարելի օգտագործել ստատիկ դաշտեր գեներիկ տիպի:
  • Տիպի մասին տեղեկատվությունը ջնջվում է գործարկման ժամանակ՝ Type Erasure, բացի bounded wildcards-ից:

Wildcards և սահմանափակ տիպի պարամետրեր:

  • <?>: Անհայտ տիպ: թույլ է տալիս կարդալ տարրեր, բայց ոչ գրել:
  • <? extends T>: Գերիշխան սահմանափակում: աշխատում է T-ի ենթատեսակների հետ, կարող է կարդալ T կամ նրա supertype-ների տարրեր, բայց չի կարող գրել (հատկապես null-ից բացի):
  • <? super T>: Նվազագույն սահմանափակում: աշխատում է T-ի supertype-ների հետ, կարող է գրել T կամ նրա ենթատեսակների տարրեր, բայց միայն Object-ի տարրեր:

Օրինակ՝

// Մեթոդ, որը կարող է տպել ցանկացած `Number` ենթատեսակների ցանկի տարրերը
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Կոմպիլյացիայի սխալ
}

// Մեթոդ, որը կարող է ավելացնել `Integer`-ը ցանկում, որը պարունակում է `Integer` կամ նրա ենթատեսակները
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Կոմպիլյացիայի սխալ, վերադարձնում է `Object`
}