Дженерики являются формой параметрического полиморфизма, найденного в диапазоне языков, включая языки.NET, Java, Быстро, и Ржавчину.
дженерики являются функцией языка, которая, как находят на определенных языках, включила форму параметрического полиморфизма. Они обычно позволяют программисту выражать понятия, такие как "Список некоторого типа T" безопасным с точки зрения типов способом. До добавления дженериков на язык Java и .NET сброс, программисты, использующие эти языки, были вынуждены к удрученному от основы Object
при использовании некоторых классов общего назначения, таких как классы набора.
С добавлением дженериков программист может вместо этого использовать типы такой как List<int>
создать безопасные с точки зрения типов списки, которые только хранят int
объекты.
Всесторонняя деталь для примеров и понятий специально для Дженериков C# обеспечивается Microsoft здесь. Информация о дженериках Java может быть найдена здесь.
В отличие от C++ шаблоны, дженерики обычно ограничиваются простой заменой типа без способности шаблонов специализироваться на определенных типах (печально известно неправильно используемый в библиотеке стандарта C++ в std::vector<bool>
который ведет себя радикально отличающийся от любого другого std::vector<T>
). Это также означает, что дженерики не хорошо подходят для универсального программирования, которое обычно полагается на способность адаптировать универсальные алгоритмы для определенных типов параметра (снова использующий пример C++, указатели применимы с любым универсальным алгоритмом, ожидая, что аргументы будут итераторами).
C# без дженериков
var list = new System.Collections.ArrayList(); list.Add(1); list.Add("banana"); // will compile int n = (int) list[0]; int s = (int) list[1]; // will compile, but throws an InvalidCastException
C# с дженериками
var list = new System.Collections.Generic.List<int>(); list.Add(1); //list.Add("banana"); -- Will not compile int n = list[0]; //string s = list[1]; -- will not compile