Typ generyczny (ang. generic type, także: typ parametryzowany) – typ zdefiniowany z użyciem jednego lub większej liczby parametrów typu (np. T), które są podstawiane konkretnymi typami w miejscu użycia; pojęcie z zakresu teorii typów i praktyki projektowania języków programowania, używane w programowaniu generycznym: pozwala opisać jedną strukturę danych lub komponent (np. listę albo mapę) tak, by działał dla różnych rodzajów danych, a konkretny rodzaj wybiera się dopiero w miejscu użycia przez podstawienie parametru typu (np. T). W efekcie ta sama definicja może tworzyć wyspecjalizowane warianty (np. Lista<int> i Lista<string>), bez potrzeby tworzenia osobnych implementacji dla każdego typu elementów.
Typ generyczny składa się z:
T, K, V),T musi implementować dane API” w C#).W praktyce typy generyczne są często używane do budowy struktur danych (kolekcji) i bibliotek algorytmów, ograniczając potrzebę rzutowań i podnosząc bezpieczeństwo typów.
W ujęciu teorii typów mechanizm typów generycznych jest praktyczną realizacją polimorfizmu parametrycznego (parametric polymorphism), czyli sytuacji, w której funkcja/typ działa jednolicie dla całej rodziny typów wyznaczonej przez parametry typu.
W Javie typy generyczne tworzą typy parametryzowane (np. C<T>). Specyfikacja opisuje m.in. zacieranie typów (ang. type erasure), czyli mapowanie typów parametryzowanych do typów bez parametrów na potrzeby kodu wykonywalnego, oraz rolę typów surowych (ang. raw types) dla zgodności wstecznej.
List<String> nazwy = new ArrayList<>();
W C#/.NET typy generyczne są powszechnie stosowane m.in. w bibliotekach kolekcji; dokumentacja podkreśla ich wpływ na wielokrotne użycie kodu, bezpieczeństwo typów i wydajność. Kompilacja generics do CIL zachowuje informację o parametrach typu w metadanych; zachowanie środowiska uruchomieniowego różni się m.in. dla typów wartościowych i referencyjnych (specjalizacja vs współdzielenie kodu).
var liczby = new List<int> { 1, 2, 3 };
W C++ rolę mechanizmu generycznego pełnią szablony. Jednym z kluczowych przykładów praktycznego zastosowania jest Standard Template Library (STL), opisywana jako zestaw generycznych komponentów C++ przeznaczonych do współpracy w spójny sposób.
template <class T>
struct Box { T value; };
W TypeScript typy generyczne (parametry typu) służą do opisu funkcji, interfejsów i klas działających dla wielu typów danych przy zachowaniu kontroli statycznej (np. Array<T>, Promise<T>). Ponieważ TypeScript jest transpilowany do JavaScriptu, adnotacje typów (w tym parametry typu) są usuwane w kodzie wynikowym, więc mechanizm generyków działa wyłącznie na etapie kompilacji/sprawdzania typów.
function identity<T>(arg: T): T {
return arg;
}
const s = identity<string>("tekst");
W Go mechanizm generyczny (type parameters) wprowadzono w wersji 1.18; obejmuje on m.in. parametry typu dla funkcji i typów oraz ich instancjonowanie. Składnia i reguły semantyczne parametrów typu są opisane w specyfikacji języka; ograniczenia (constraints) wyraża się za pomocą interfejsów (w tym tzw. type sets).
package main
type Number interface {
~int | ~int64 | ~float64
}
func Sum[T Number](xs []T) T {
var s T
for _, v := range xs {
s += v
}
return s
}
Relacja podtypów dla typów generycznych zależy od języka i konstrukcji:
Lista<Kot> nie jest podtypem Lista<Zwierzę> (nawet jeśli Kot jest podtypem Zwierzę), co w Javie uzasadniano m.in. zachowaniem bezpieczeństwa typów dla typów parametryzowanych;