Sobes.tech
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.