Typ generyczny

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.

Charakterystyka

Typ generyczny składa się z:

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 (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<>();

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:

Zobacz też

Przypisy

  1. 1 2 3 Luca Cardelli; Peter Wegner. On Understanding Types, Data Abstraction, and Polymorphism. „ACM Computing Surveys”. 17 (4), s. 475–478, 1985-12. DOI: 10.1145/6041.6042. [dostęp 2026-01-19]. (ang.).
  2. 1 2 Marcin Pietraszek, Typy generyczne w języku Java [online], Samouczek Programisty, 26 marca 2016 [dostęp 2026-01-19].
  3. 1 2 C# - typy generyczne - plukasiewicz.net [online], www.plukasiewicz.net [dostęp 2026-01-19].
  4. 1 2 Generic classes and methods – C#. Microsoft Learn. [dostęp 2026-01-20]. (ang.).
  5. 1 2 Generic classes and methods – C# [online] [dostęp 2026-01-19] (ang.).
  6. 1 2 3 Gilad Bracha; Martin Odersky; David Stoutamire; Philip Wadler. Making the Future Safe for the Past: Adding Genericity to the Java™ Programming Language. „OOPSLA ’98 (Conference Proceedings)”, s. 183–200, 1998-10. DOI: 10.1145/286942.286957. [dostęp 2026-01-19]. (ang.).
  7. 1 2 The Java® Language Specification, Java SE 16 – §4.5 Parameterized Types; §4.6 Type Erasure [online], Oracle Documentation [dostęp 2026-01-19] (ang.).
  8. ↑ Generic types (generics) overview – .NET [online], Microsoft Learn [dostęp 2026-01-19] (ang.).
  9. ↑ Generics in the runtime (C# programming guide) [online], Microsoft Learn [dostęp 2026-01-19] (ang.).
  10. ↑ Alexander A. Stepanov; Meng Lee. The Standard Template Library. „Hewlett-Packard Laboratories Technical Report (HPL-94-34 (R.1))”, s. 4, 1994-04. [dostęp 2026-01-19]. (ang.).
  11. ↑ Documentation – Generics. TypeScript. [dostęp 2026-01-20]. (ang.).
  12. ↑ Documentation – The Basics. TypeScript. [dostęp 2026-01-20]. (ang.).
  13. ↑ Go 1.18 Release Notes. The Go Project. [dostęp 2026-01-20]. (ang.).
  14. ↑ The Go Programming Language Specification. The Go Project. [dostęp 2026-01-20]. (ang.).
  15. ↑ Covariance and contravariance in generics – .NET [online], Microsoft Learn [dostęp 2026-01-19] (ang.).