Middle
Ce sunt Generics și pentru ce sunt folosiți?
sobes.tech AI
Răspuns de la AI
Generics în Java permit crearea de clase, interfețe și metode care lucrează cu tipuri parametrizate.
Scopul principal al Generics:
- Creșterea siguranței tipurilor: Compilatorul verifică tipurile în timpul compilării, prevenind
ClassCastExceptionîn timpul execuției. - Eliminarea conversiilor de tip: Nu este nevoie să convertești manual tipurile atunci când extragi elemente din colecții.
- Crearea de cod mai flexibil și reutilizabil: Poți scrie algoritmi și structuri de date generice aplicabile diferitelor tipuri de date.
Exemplu fără Generics:
// Înainte de Java 5
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // fără tipizare
list.add("salut");
list.add(123); // poate adăuga orice obiect
String s = (String) list.get(0); // necesită conversie de tip
Integer i = (Integer) list.get(1); // necesită conversie de tip
// Poate apărea o eroare de conversie
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Exemplu cu Generics:
// Cu Generics
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // listă de șiruri
list.add("salut");
// list.add(123); // eroare de compilare - nu se poate adăuga Integer
String s = list.get(0); // fără nevoie de conversie de tip
// Nu se poate adăuga alt tip, previne erorile
// List<Integer> intList = new ArrayList<>();
// intList.add("lume"); // eroare de compilare
System.out.println(s);
}
}
Generics sunt folosiți și în:
- Clase:
ArrayList<E>,HashMap<K, V> - Interfețe:
List<E>,Map<K, V> - Metode:
<T> void printArray(T[] array) - Restricții de tip:
<T extends Comparable<T>>(restricție pentru tipurile care implementeazăComparable)
Implementarea Generics în Java se bazează pe "erasure" (eliminarea tipurilor) în timpul compilării. Aceasta înseamnă că informațiile despre tipurile generice sunt eliminate, iar în timpul execuției JVM-ul operează cu tipuri brute. Acest lucru asigură compatibilitatea cu versiunile mai vechi de Java, dar are anumite limitări.