Typ generyczny (, 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. Charakterystyka Typ generyczny składa się z: definicji (np. klasy, interfejsu, typu algebraicznego), parametrów typu (np. T, K, V), ewentualnych ograniczeń parametrów (np. „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.
Związek z polimorfizmem parametrycznym 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.
Implementacje w językach programowania Java W Javie typy generyczne tworzą typy parametryzowane (np. C<T>). Specyfikacja opisuje m.in. zacieranie typów (), czyli mapowanie typów parametryzowanych do typów bez parametrów na potrzeby kodu wykonywalnego, oraz rolę typów surowych () dla zgodności wstecznej.
List<String> nazwy = new ArrayList<>();
C# i platforma .NET 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 };
C++ 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; };
TypeScript 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");
Go 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 }
Wariancja i (nie)zmienniczość Relacja podtypów dla typów generycznych zależy od języka i konstrukcji: w podejściu „niezmienniczym” () 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; platforma .NET rozróżnia także wariancję (kowariancję i kontrawariancję) dla wybranych typów generycznych (np. interfejsów i delegatów), a dokumentacja definiuje pojęcia kowariancji, kontrawariancji i niezmienniczości w kontekście generics.
Zobacz też Programowanie generyczne Polimorfizm parametryczny Szablon (C++) Teoria typów
Przypisy
Kategoria:Typy danych