Skip to content

Generics în Java — Tipuri Parametrizate și Wildcards

DodaTech Updated 2025-01-15 2 min read

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 de List<String>) — pierzi siguranța tipurilor
  • Folosește ? extends T când citești și ? super T câ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

  1. Confuzia între List<?> și List<Object>List<?> acceptă orice tip, dar nu poți adăuga elemente (poți citi ca Object).
  2. Erasure de tip care surprinde — la runtime, List<String> e doar List. Generics sunt doar la compilare.
  3. Folosirea genericelor cu primitive — nu poți face List<int>, trebuie List<Integer>.

FAQ

### Ce sunt generics în Java?

Un mecanism care permite parametrizarea tipurilor, oferind siguranță la compilare și eliminând necesitatea cast-urilor explicite.

Ce este type erasure?

Procesul prin care compilatorul elimină informația de tip generic în bytecode. List<String> devine List la runtime.

Ce înseamnă PECS?

Producer Extends, Consumer Super — un principiu care spune: ? extends T când produci (citești) valori, ? super T când consumi (scrii) valori.

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