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 tipT. - 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 folositList<Integer>). - Nu se pot crea array-uri de tipuri generice direct (de exemplu,
T[] array = new T[10]- greșit, trebuie folositArrayListsau 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 deT. Se pot citi elemente de tipTsau supertipurile sale, dar nu se pot scrie (cu excepțianull).<? super T>: Limita inferioară. Permite lucrul cu tipuri care sunt supertipuri deT. Se pot scrie elemente de tipTsau subtipurile sale, dar la citire se poate obține doarObject.
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
}