Sobes.tech
Middle

Czym są typy generyczne?

sobes.tech AI

Odpowiedź od AI

Typy generyczne pozwalają na definiowanie klas, interfejsów i metod z użyciem parametrów typu. To zwiększa elastyczność, ponowne użycie i bezpieczeństwo typu kodu, umożliwiając pracę z różnymi typami danych bez utraty statycznej kontroli typów.

Kluczowe zalety:

  • Bezpieczeństwo typu: Kompilator sprawdza typy na etapie kompilacji, zapobiegając błędom podczas wykonywania związanym z niezgodnością typów.
  • Ponowne użycie: Ten sam kod można używać z różnymi typami danych, co zmniejsza duplikację kodu.
  • Wydajność: W niektórych językach (np. C#) typy generyczne są implementowane z uwzględnieniem konkretnego typu, co może poprawić wydajność w porównaniu do użycia Object.

Przykłady użycia:

  • Kolekcje: Listy, słowniki, zbiory parametryzowane typem elementów.
  • Metody: Metody pracujące z dowolnym typem danych implementującym określony interfejs.
  • Klasy: Klasy opakowujące, fabryki, pracujące z parametrami typu.

Przykład w C#:

// Lista generyczna
List<string> nazwy = new List<string>();
nazwy.Add("Alice");
nazwy.Add("Bob");

// Metoda generyczna
public T PobierzPierwszyElement<T>(List<T> lista)
{
    if (lista != null && lista.Count > 0)
    {
        return lista[0];
    }
    return default(T); // Zwraca domyślną wartość dla typu T
}

Przykład w Javie:

// Lista generyczna
List<String> nazwy = new ArrayList<>();
nazwy.add("Alice");
nazwy.add("Bob");

// Metoda generyczna
public <T> T pobierzPierwszyElement(List<T> lista) {
    if (lista != null && !lista.isEmpty()) {
        return lista.get(0);
    }
    return null; // Zwraca null dla typów referencyjnych
}

Przykład w Pythonie (type hinting):

from typing import List, TypeVar

T = TypeVar('T')

def pobierzPierwszyElement(dane: List[T]) -> T | None:
    # Funkcja może pracować z dowolną listą i zwracać element
    if dane:
        return dane[0]
    return None

nazwy: List[str] = ["Alice", "Bob"]
pierwsza_nazwa = pobierzPierwszyElement(nazwy) # IDE rozumie, że pierwza_nazwa to str

W niektórych językach (Java) typy generyczne korzystają z "wymazywania" (type erasure), gdzie informacja o typie parametru jest usuwana na etapie kompilacji. Może to prowadzić do pewnych ograniczeń. W innych językach (C#, Go) informacja o typie jest zachowywana podczas wykonywania.

Typy generyczne są podstawowym narzędziem do pisania czystego, bezpiecznego i ponownie używalnego kodu.