Описание тега generics
дженерики - это языковая функция, обнаруженная в некоторых языках и обеспечивающая некую форму параметрического полиморфизма. Обычно они позволяют программисту выражать такие понятия, как "Список некоторого типа T", безопасным для типов способом. До добавления универсальных шаблонов к языку java и .net clr программисты, использующие эти языки, были вынуждены отказаться от базовогоObject
при использовании некоторых классов общего назначения, например классов коллекций.
С добавлением обобщений программист может вместо этого использовать такие типы, какList<int>
для создания типизированных списков, в которых хранятся только int
объекты.
Подробные сведения о примерах и концепциях специально для C# Generics предоставлены Microsoft здесь. Информацию о дженериках Java можно найти здесь.
В отличие от шаблонов C++, универсальные шаблоны обычно ограничиваются простой заменой типов без возможности шаблонов специализироваться на определенных типах (печально известно, что они неправильно используются в стандартной библиотеке C++ в std::vector<bool>
который ведет себя радикально иначе, чем любой другой std::vector<T>
). Это также означает, что универсальные шаблоны плохо подходят для универсального программирования, которое обычно полагается на способность адаптировать универсальные алгоритмы для определенных типов параметров (опять же, используя пример C++, указатели можно использовать с любым универсальным алгоритмом, ожидающим, что аргументы будут итераторами).
Общие учебные пособия по Java
.NET Generic Tutorials
пример
C# без Generics
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# с Generics
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