Sobes.tech
Middle

Care sunt posibilitățile în Generics?

sobes.tech AI

Răspuns de la AI

Generics permit crearea de clase, interfețe și metode parametrizate.

Funcții principale:

  • Reutilizarea codului: Crearea de structuri de date și algoritmi universali care funcționează cu orice tip.
  • Siguranța tipurilor în timpul compilării: Erorile de tip sunt detectate în timpul compilării, nu în timpul execuției. Elimină necesitatea conversiilor manuale de tip și erorile potențiale ClassCastException.
  • Citire mai clară: Codul devine mai ușor de înțeles, deoarece indică clar cu ce tipuri lucrează.

Exemple:

  • Clasa container List<T> poate stoca elemente de orice tip T.
  • Metoda static <T> T getFirst(List<T> list) poate returna primul element din orice listă de orice tip.

Limitări ale Generics:

  • Nu se pot crea instanțe ale tipurilor generice: new T().
  • Nu se pot folosi tipuri primitive ca parametri de tip (de exemplu, List<int> - greșit, trebuie folosit List<Integer>).
  • Nu se pot crea array-uri de tipuri generice direct (de exemplu, T[] array = new T[10] - greșit, trebuie folosit ArrayList sau cast).
  • Nu se pot folosi câmpuri statice ale tipurilor generice direct.
  • Informația despre tipuri este ștearsă în timpul execuției (Type Erasure), cu excepția wildcard-urilor limitate.

Wildcards și parametri de tip limitați:

  • <?>: Tip necunoscut. Permite citirea elementelor, dar nu și scrierea.
  • <? extends T>: Limita superioară. Permite lucrul cu tipuri care sunt subtipuri de T. Se pot citi elemente de tip T sau supertipurile sale, dar nu se pot scrie (cu excepția null).
  • <? super T>: Limita inferioară. Permite lucrul cu tipuri care sunt supertipuri de T. Se pot scrie elemente de tip T sau subtipurile sale, dar la citire se poate obține doar Object.

Exemplu:

// Metodă care poate afișa elemente din orice listă conținând subtipuri de Number
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Eroare de compilare
}

// Metodă care poate adăuga Integer în listă
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Eroare de compilare, returnează Object
}