Ce posibilități oferă Generics în Java?
sobes.tech AI
Răspuns de la AI
Generics în Java îmbunătățesc siguranța tipurilor de cod, prevenind erorile de timp de execuție legate de conversia tipurilor. Principalele caracteristici:
-
Verificarea tipurilor în timpul compilării: Compilatorul verifică utilizarea corectă a tipurilor specificate în Generics, ceea ce permite identificarea erorilor înainte de rularea programului.
// Fără Generics - posibil ClassCastException List list = new ArrayList(); list.add("șir"); list.add(123); // Adăugare Integer String s = (String) list.get(1); // Eroare la rulare // Cu Generics - eroare de compilare List<String> stringList = new ArrayList<>(); stringList.add("șir"); // stringList.add(123); // Eroare de compilare String str = stringList.get(0); // Obținere sigură -
Eliminarea conversiilor de tipuri (type casting): Generics elimină necesitatea conversiilor explicite la obținerea elementelor din colecții sau utilizarea claselor parametrizate.
// Fără Generics List list = new ArrayList(); list.add("Salut"); String s = (String) list.get(0); // Conversie explicită // Cu Generics List<String> stringList = new ArrayList<>(); stringList.add("Salut"); String str = stringList.get(0); // Nu este nevoie de conversie -
Implementarea codului generic (Metode generice, Clase generice, Interfețe generice): Permite crearea de algoritmi și structuri de date generice care funcționează cu diferite tipuri, fără a duplica codul.
// Metodă generică pentru imprimarea unui array public static <T> void printArray(T[] array) { for (T element : array) { System.out.print(element + " "); } System.out.println(); } // Clasă generică - pereche de valori class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } -
Suport pentru Wildcards: Permite definirea restricțiilor flexibile asupra tipurilor în tipurile parametrizate.
?(Wildcard nelimitat): Orice tip.? extends T(Wildcard cu limită superioară): Tipul trebuie să fieTsau un subtip al său.? super T(Wildcard cu limită inferioară): Tipul trebuie să fieTsau un supertip al său.
// Metodă care acceptă o listă de orice tip public static void processList(List<?> list) { // ... } // Metodă care acceptă o listă de numere sau subtipurile lor public static void processNumbers(List<? extends Number> list) { // ... } // Metodă care acceptă o listă de șiruri sau supertipurile lor public static void addStrings(List<? super String> list) { list.add("șir nou"); } -
Utilizare în cadrul framework-ului Collections: Toate clasele principale de colecții (List, Set, Map etc.) sunt parametrizate, ceea ce face ca lucrul cu colecțiile să fie sigur în tipuri și convenabil.
Generics sunt un element cheie al Java modern, sporind fiabilitatea și lizibilitatea codului.