Middle
Ի՞նչ են Generics-ը և ինչու են օգտագործվում:
sobes.tech AI
Պատասխան AI-ից
Generics-ը Java-ում թույլ է տալիս ստեղծել դասեր, ինտերֆեյսներ և մեթոդներ, որոնք աշխատում են պարամետրացված տիպերով:
Հիմնական նպատակները՝
- Տիպային անվտանգության բարձրացում: Կոմպիլատորը ստուգում է տիպերը կոմպիլացիայի ժամանակ, կանխելով
ClassCastExceptionգործարկման ժամանակ: - Տիպային փոխակերպումների վերացում: Չի պահանջվում ձեռքով փոխարկել տիպերը հավաքածուներից տարրեր հանելու ժամանակ:
- Ավելացնել ավելի ճկուն և վերօգտագործելի կոդ: Կարող եք գրել ընդհանուր ալգորիթմներ և տվյալների կառուցվածքներ, որոնք կիրառելի են տարբեր տիպերի համար:
Բերենք առանց Generics օրինակ:
// Մինչ Java 5
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // առանց տիպավորման
list.add("hello");
list.add(123); // կարող է ավելացնել ցանկացած օբյեկտ
String s = (String) list.get(0); // անհրաժեշտ է տիպային փոխարկում
Integer i = (Integer) list.get(1); // անհրաժեշտ է տիպային փոխարկում
// Տիպային փոխարկման սխալ հնարավոր է
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Բերենք Generics-ով:
// Generics-ով
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // տողերի ցանկ
list.add("hello");
// list.add(123); // կոմպիլյացիոն սխալ - չի կարելի ավելացնել Integer
String s = list.get(0); // տիպային փոխարկում անհրաժեշտ չէ
// Անհնար է ավելացնել այլ տիպ, կանխում է սխալը
// List<Integer> intList = new ArrayList<>();
// intList.add("world"); // կոմպիլյացիոն սխալ
System.out.println(s);
}
}
Generics-ները նաև օգտագործվում են՝
- Դասերում:
ArrayList<E>,HashMap<K, V> - Ինտերֆեյսներում:
List<E>,Map<K, V> - Մեթոդներում:
<T> void printArray(T[] array) - Տիպային սահմանափակումներում:
<T extends Comparable<T>>(սահմանափակումComparable-ին համապատասխանող տիպերի համար)
Java-ում Generics-ների իրականացման հիմքը տիպերի մաքրում (type erasure)-ն է, որը կատարվում է կոմպիլացիայի ժամանակ: Սա նշանակում է, որ գեներիկ տիպերի մասին տեղեկատվությունը հեռացվում է, և գործարկման ժամանակ JVM-ը աշխատում է մաքուր տիպերով: Սա ապահովում է հետագա համատեղելիություն հին Java տարբերակների հետ, բայց ունի որոշ սահմանափակումներ։