Sobes.tech
Middle

Czym są generyki?

sobes.tech AI

Odpowiedź od AI

Generyki to mechanizm umożliwiający pisanie klas, interfejsów i metod, które działają z danymi różnych typów, zapewniając bezpieczeństwo typów podczas kompilacji. Pozwalają tworzyć komponenty wielokrotnego użytku, które mogą działać z dowolnym typem danych, nie tracąc informacji o typie, co minimalizuje błędy konwersji typów na etapie wykonywania.

Główne zalety:

  • Bezpieczeństwo typów: Kompilator sprawdza poprawność użycia typów w strukturach generycznych.
  • Zmniejszenie ilości kodu: Pojedyncza klasa lub metoda generyczna może obsługiwać wiele typów.
  • Czytelność kodu: Jasno widać, z jakimi typami pracuje komponent.
  • Zwiększenie wydajności (w niektórych przypadkach): Brak konieczności konwersji typów podczas wykonywania może nieznacznie poprawić wydajność.

Przykład (Java):

// Przykład klasy generycznej
class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

// Użycie klasy generycznej z różnymi typami
Box<Integer> integerBox = new Box<>();
integerBox.setContent(10);
int value = integerBox.getContent(); // Bezpieczne typy, nie trzeba rzutować na int

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String text = stringBox.getContent(); // Bezpieczne typy, nie trzeba rzutować na String

Przykład (Python - Type Hinting, zbliżony do Generics):

from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self) -> None:
        self._content: T | None = None

    def set_content(self, content: T) -> None:
        self._content = content

    def get_content(self) -> T | None:
        return self._content

# Użycie z type hinting
integer_box: Box[int] = Box()
integer_box.set_content(10)
value: int | None = integer_box.get_content() # Pomaga narzędziom analizy statycznej

string_box: Box[str] = Box()
string_box.set_content("Hello")
text: str | None = string_box.get_content() # Pomaga narzędziom analizy statycznej