Описание тега generics

Обобщения - это форма параметрического полиморфизма, встречающаяся в ряде языков, включая языки.NET, Java, Swift и Rust.

дженерики - это языковая функция, обнаруженная в некоторых языках и обеспечивающая некую форму параметрического полиморфизма. Обычно они позволяют программисту выражать такие понятия, как "Список некоторого типа T", безопасным для типов способом. До добавления универсальных шаблонов к языку java и .net clr программисты, использующие эти языки, были вынуждены отказаться от базовогоObject при использовании некоторых классов общего назначения, например классов коллекций.

С добавлением обобщений программист может вместо этого использовать такие типы, какList<int> для создания типизированных списков, в которых хранятся только int объекты.

Подробные сведения о примерах и концепциях специально для C# Generics предоставлены Microsoft здесь. Информацию о дженериках Java можно найти здесь.

В отличие от шаблонов C++, универсальные шаблоны обычно ограничиваются простой заменой типов без возможности шаблонов специализироваться на определенных типах (печально известно, что они неправильно используются в стандартной библиотеке C++ в std::vector<bool> который ведет себя радикально иначе, чем любой другой std::vector<T>). Это также означает, что универсальные шаблоны плохо подходят для универсального программирования, которое обычно полагается на способность адаптировать универсальные алгоритмы для определенных типов параметров (опять же, используя пример C++, указатели можно использовать с любым универсальным алгоритмом, ожидающим, что аргументы будут итераторами).

Общие учебные пособия по Java

  1. Универсальные методы Java и универсальные классы Учебники
  2. Часто задаваемые вопросы по Java Generics

.NET Generic Tutorials

  1. Введение в дженерики
  2. C# Generics

пример

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