Подтвердить что ты не робот

Почему дженерики называются дженериками?

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

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

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

в то время как общий набор строк типа может содержать только строки:

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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


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

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

"Общая переменная типа" стала CS-жаргоном.

Ответ 3

bool Equals(int x, int y)

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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


ON EDIT:

Здесь другая точка зрения...

Список типов < Строкa > это не то, о чем они говорят, когда они относятся к "родовому" типу. Я думаю, что терминология на самом деле относится к списку <T> , что и есть тип в его общей форме. Список <String> является специализацией общего списка <T> .

Ответ 6

Если они назвали его "параметром (-ами) типа", люди смутили бы его с параметрами типа Type.

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

Ответ 7

Я не являюсь "родным" английским спикером, поэтому я могу ошибаться, но точка "Generics" заключается в том, что типы Define Generics, не так ли?

Ответ 8

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

Ответ 9

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

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