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`
}