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