Generics în Java — Tipuri Parametrizate și Wildcards
In this tutorial, you'll learn about Generics în Java. We cover key concepts, practical examples, and best practices.
Generics în Java permit parametrizarea tipurilor, permițând scrierea de clase și metode care lucrează cu orice tip de date într-un mod type-safe, fără a necesita cast-uri și eliminând astfel erorile de tip la compilare.
The Problem
Codul care folosește tipuri brute (raw types) și cast-uri explicite e predispus la ClassCastException în runtime. Acest quick-fix îți arată cum să folosești generics pentru siguranța tipurilor la compilare.
The Wrong Way
List list = new ArrayList();
list.add("text");
list.add(123);
String s = (String) list.get(1); // ClassCastException!
Output:
Exception in thread "main" java.lang.ClassCastException
Fără generics, poți adăuga orice tip, dar cast-urile pot eșua la runtime.
The Right Way
List<String> list = new ArrayList<>();
list.add("text");
// list.add(123); // eroare de compilare
String s = list.get(0); // fără cast
Output:
text // sigur la compilare
Step-by-Step Fix
1. Declară clasa sau interfața cu parametru de tip
public class Container<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
2. Folosește wildcards pentru flexibilitate
// ? extends T — producător (read-only)
void process(List<? extends Number> list) {
Number n = list.get(0); // ok
// list.add(1); // eroare — nu poți adăuga
}
// ? super T — consumator (write)
void addNumbers(List<? super Integer> list) {
list.add(123); // ok
// Integer i = list.get(0); // eroare — tip necunoscut
}
3. Metode generice
public <T> T getFirst(List<T> list) {
return list.get(0);
}
Prevention Tips
- Nu folosi raw types (
Listîn loc deList<String>) — pierzi siguranța tipurilor - Folosește
? extends Tcând citești și? super Tcând scrii (PECS — Producer Extends, Consumer Super) - Limitează parametrii de tip cu bounded type parameters (
<T extends Number>) - Nu crea array-uri de tip generic —
new T[10]nu e permis
Common Mistakes
- Confuzia între
List<?>șiList<Object>—List<?>acceptă orice tip, dar nu poți adăuga elemente (poți citi ca Object). - Erasure de tip care surprinde — la runtime,
List<String>e doarList. Generics sunt doar la compilare. - Folosirea genericelor cu primitive — nu poți face
List<int>, trebuieList<Integer>.
FAQ
Construit de dezvoltatorii Doda Browser, DodaZIP și Durga Antivirus Pro. Instrumentele DodaTech se integrează perfect cu Java pentru productivitate și securitate sporite.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro