Вопрос

Рискуя стать деревенским идиотом, может ли кто-нибудь объяснить мне, почему дженерики называются дженериками?Я понимаю их использование и преимущества, но если определение общего являются ли "общие" и универсальные коллекции типобезопасными, тогда почему это не неправильное название?

Например, ArrayList может содержать все, что является объектом:

ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);

в то время как универсальная коллекция типа string может содержать только строки:

var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");

Я просто не совсем понимаю, почему это называется "общим".Если ответ "...которые позволяют разрабатывать классы и методы, которые откладывают спецификацию одного или нескольких типов до тех пор, пока класс или метод не будет объявлен и создан клиентским кодом." из здесь, - тогда, я полагаю, в этом есть смысл.Возможно, у меня такой мысленный провал, потому что я начал программировать только после того, как Java представила дженерики, поэтому я не помню времени до них.Но все же...

Любая помощь приветствуется.

Это было полезно?

Решение

"Универсальный" - это когда речь идет о реализации.Вы пишете единую "универсальную" реализацию списка, которая работает с любым типом, вместо того, чтобы писать конкретные реализации для каждого типа, который вы хотите использовать.

Другие советы

Я думаю, что правильный ответ на подобные вопросы почти всегда звучит так: "в основном по историческим причинам".Дженерики с таким же успехом можно было бы называть "схемами", или "классами", или "семействами типов", или "родами", или "функциями типов", или "статикой", или "греческими типами", или любым из миллиона других понятий.Давным-давно кто-то решил использовать слово "универсальный", и оно прижилось.

"Универсальный" в смысле Java восходит, по крайней мере, к середине 1970-х годов.СШАМинистерство обороны оттачивало документ о требованиях к своему новому языку программирования (который впоследствии станет ADA).Ранний черновик ("Дровосек", август 1975) говорит:

Параметры времени компиляции необходимы в расширяемых языках, чтобы разрешить спецификацию общих процедур и структур данных, таких как стеки и очереди, без повторения определения для каждого типа элемента.

Это единственное использование термина "общий" в документе.Мне не совсем ясно, как это было задумано.Но к июлю 1977 г. ("Железный дровосек") там был целый параграф о дженериках, и этот термин явно стал означать что-то конкретное:

12D.ОБЩИЕ ОПРЕДЕЛЕНИЯ

Должна быть возможность определять функции, процедуры и типы с параметрами, которые создаются во время трансляции при каждом вызове.Такими параметрами могут быть любые определенные идентификаторы (включая идентификаторы переменных, функций или типов), выражения или инструкции.Эти параметры, как и все другие параметры, должны оцениваться в контексте вызова.

К июню 1978 г. ("Человек из стали") это был устоявшийся жаргон;термин "общий" использовался и в других разделах документа, явно имея в виду эту особенность.На готовом языке, generic это было зарезервированное слово.

Авторы этих документов перечислены на сайте, и, по-видимому, большинство из них все еще существуют.Было бы неплохо позвонить им и спросить, что они помнят.


Самое раннее правдоподобное использование термина "универсальный", которое я нашел в научных кругах, было в книге Робина Милнера "Теория полиморфизма типов в программировании" (1978) (и он чувствует себя обязанным объяснить, что он подразумевает под "общим", так что в то время оно не могло быть широко распространено в научных кругах):

Итак, это общий тип Карта, то есть к любому возникновению Карта в рамках этого объявления должен быть назначен некоторый экземпляр замены этого типа.

"Переменная универсального типа" стала жаргоном CS.

bool Equals(int x, int y)

Приведенный выше метод может сравнивать только целые числа, поэтому мы можем сказать, что он специализирован для сравнения целых чисел.

bool Equals<T>(T x, T y);

Приведенный выше метод может сравнивать значения любого типа, поэтому мы можем сказать, что он не является специализированным для какого-либо конкретного типа - это универсальный .

Я не хочу вдаваться в семантику языка (английский, а не в java) и рискую ответить вам тавтологией; универсальный метод называется generic, потому что, как вы сказали, его можно использовать в общем смысле, он не имеет определенного типа, его можно использовать вообще

Хорошо, возьмите это с крошкой соли, потому что я полностью догадываюсь, но мне интересно, может ли это быть бастардизацией " Generative Типы Quot &;.

Концептуально, когда вы специализируете List на List < String & Gt ;, генерирует новый тип. По крайней мере, именно так это работает в шаблонах C ++ и в обобщениях C #.

В Java, поскольку параметризация отбрасывается компилятором с использованием стирания типов, он фактически не генерирует новый специализированный тип, так что, кто знает?

Полагаю, вы могли бы сказать, что Java реализует обобщенную версию порождающих типов:)

<Ч>

НА РЕДАКТ.:

Вот еще одна точка зрения ...

Список типов < Строка & Gt; это не то, о чем они говорят, когда ссылаются на " generic " тип. Я думаю, что терминология на самом деле относится к списку & Lt; T & Gt; тип, то есть, как тип существует в его общей форме. Список л &; Строка & Gt; является специализацией универсального List < T & Gt;.

Если они назвали это " параметр типа (ов) " люди будут путать это с параметрами типа Type.

Кроме того, ArrayList не является " generic " ;. Он работает ТОЛЬКО с типами объектов. Если вы спросите его о чем-то, он даст вам ссылку на объект. Это очень специфическое поведение.

Класс, который принимает объекты, НЕ является универсальным, он очень определенно принимает тип , который сам является универсальным типом. Универсальный класс, с другой стороны, может использоваться с любым конкретным типом.

Потому что вы создаете " Generic " код, который будет способен работать с любым типом (в пределах указанных ограничений) таким же образом ...

Хороший пример, с которым вы знакомы, это оператор Add почти для любого языка ... он может " Add " целые числа, числа с плавающей запятой, числа с двойными числами, десятичные числа, двоичные числа, шестнадцатеричные числа независимо от того, подписаны они или нет, сколько они битов и т. д.

Я не " native " Говорю по-английски, так что я могу ошибаться, но смысл & Quen; Generics & Quot; это типы Define Generics, не так ли?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top