Sobes.tech
Middle

Czym są Generics i do czego służą?

sobes.tech AI

Odpowiedź od AI

Generics w Java pozwalają na tworzenie klas, interfejsów i metod, które działają z parametryzowanymi typami.

Głównym celem generics:

  • Zwiększenie bezpieczeństwa typów: Kompilator sprawdza typy na etapie kompilacji, zapobiegając ClassCastException podczas działania.
  • Usunięcie konieczności rzutowania typów: Nie trzeba ręcznie rzutować typów podczas pobierania elementów z kolekcji.
  • Tworzenie bardziej elastycznego i wielokrotnego użytku kodu: Można pisać ogólne algorytmy i struktury danych, które można stosować do różnych typów danych.

Przykład bez generics:

// Przed Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // bez typowania
        list.add("cześć");
        list.add(123); // można dodać dowolny obiekt

        String s = (String) list.get(0); // konieczne rzutowanie
        Integer i = (Integer) list.get(1); // konieczne rzutowanie

        // Możliwy błąd rzutowania
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Przykład z generics:

// Z użyciem generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // lista stringów
        list.add("cześć");
        // list.add(123); // błąd kompilacji - nie można dodać Integer

        String s = list.get(0); // brak konieczności rzutowania

        // Nie można dodać innego typu, co zapobiega błędom
        // List<Integer> intList = new ArrayList<>();
        // intList.add("świat"); // błąd kompilacji
        System.out.println(s);
    }
}

Generics są również używane w:

  • Klasach: ArrayList<E>, HashMap<K, V>
  • Interfejsach: List<E>, Map<K, V>
  • Metodach: <T> void printArray(T[] array)
  • Ograniczeniach typów: <T extends Comparable<T>> (ograniczenie do typów implementujących Comparable)

Implementacja generics w Java opiera się na "wymazywaniu typów" (type erasure) w fazie kompilacji. Oznacza to, że informacje o typach generycznych są usuwane, a w czasie działania JVM operuje na surowych typach. Zapewnia to kompatybilność z wcześniejszymi wersjami Java, ale ma pewne ograniczenia.