Ответ 1
"Общий" говорит о реализации. Вы пишете единую реализацию "Generic" list, которая работает с любым типом, вместо того, чтобы писать конкретные реализации для каждого типа, который вы хотите использовать.
рискуя стать деревенским идиотом, может кто-нибудь объяснить мне, почему дженерики называются дженериками? Я понимаю их использование и преимущества, но если определение родового является "общим", а общие коллекции безопасны по типу, то почему это не так? неправильно?
Например, ArrayList может содержать все, что объект:
ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);
в то время как общий набор строк типа может содержать только строки:
var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");
Я просто не понимаю, почему он называется "generic". Если ответ "... который позволяет создавать классы и методы, которые откладывают спецификацию одного или нескольких типов до тех пор, пока класс или метод не будет объявлен и не будет создан кодом клиента". от здесь, то я полагаю, что это имеет смысл. Возможно, у меня есть это умственное отставание, потому что я начал программировать только после того, как Java представила дженерики, поэтому я не помню времени до них. Но все же...
Любая помощь приветствуется.
"Общий" говорит о реализации. Вы пишете единую реализацию "Generic" list, которая работает с любым типом, вместо того, чтобы писать конкретные реализации для каждого типа, который вы хотите использовать.
Я думаю, что правильный ответ на такие вопросы почти всегда "исторические причины, в основном". Дженерики также можно было бы назвать "схемами" или "классами" или "типами семейств" или "родами" или "функциями типа" или "статикой" или "греческими типами" или любым из миллионов других вещей. Давным-давно кто-то решил использовать слово "generic", и он застрял.
"Общий" в смысле Java датируется, по крайней мере, до середины 1970-х годов. Министерство обороны США оттачивало документ требований для своего нового языка программирования (что станет ADA). Ранний проект ( "Деревятель" , август 1975 года) гласит:
Параметры времени компиляции требуются в расширяемых языках, чтобы разрешить спецификацию общих процедур и структур данных, таких как стеки и очереди, не повторяя определения для каждого типа элемента.
Это единственное использование "общего" в документе. Мне непонятно, как это было предназначено. Но к июлю 1977 года ( "Tinman" ) был целый параграф о дженериках, и этот термин явно означал что-то конкретное:
12D. ОБЩИЕ ОПРЕДЕЛЕНИЯ
Должно быть возможно определить функции, процедуры и типы с параметрами, которые создаются во время перевода при каждом вызове. Такими параметрами могут быть любой определенный идентификатор (в том числе для переменных, функций или типов), выражение или оператор. Эти параметры, как и все другие параметры, должны оцениваться в контексте вызова.
К июню 1978 года ( "Steelman" ) был установлен жаргон; в других разделах документа использовались другие термины "общий", что явно относится к этой функции. На готовом языке generic
было зарезервированным словом.
Авторы этих документов перечислены на сайте, и, по-видимому, большинство из них все еще существуют. Было бы здорово вызвать их и спросить, что они помнят.
Самое раннее правдоподобное использование "общего", которое я нашел в академических кругах, было в Robin Milner "Теория типового полиморфизма в программировании" (1978) ) (и он чувствует себя вынужденным объяснить, что он подразумевает под "общим", поэтому в то время это не могло быть распространено в академических кругах):
Таким образом, это общий тип карты, т.е. любому вхождению карты в область действия этого объявления должен быть назначен некоторый экземпляр подстановки этого типа.
"Общая переменная типа" стала CS-жаргоном.
bool Equals(int x, int y)
Вышеупомянутый метод может сравнивать только целые числа, поэтому мы можем сказать, что он специализирован для сравнения целых чисел.
bool Equals<T>(T x, T y);
Вышеупомянутый метод может сравнивать значения любого типа, поэтому мы можем сказать, что он не специализирован для какого-либо конкретного типа - он общий.
Я не хочу вдаваться в семантику языка (английский, а не java) и рискуя ответом на вас с тавтологией; общий метод называется общим, потому что, как вы сказали, его можно использовать в общем смысле, он не имеет определенного типа, его можно вообще использовать
Хорошо, возьмите это с солью, потому что я полностью догадываюсь, но мне интересно, может ли это быть бастардизацией "Generative Types".
Концептуально, когда вы специализируетесь на List в List <String> , он генерирует новый тип. По крайней мере, так, как это работает в шаблонах С++ и в обобщенных файлах С#.
В Java, поскольку параметризации отбрасываются компилятором с использованием стирания типа, на самом деле не создает новый специализированный тип, поэтому кто знает?
Я полагаю, вы могли бы сказать, что Java реализует обобщенную версию генеративных типов:)
ON EDIT:
Здесь другая точка зрения...
Список типов < Строкa > это не то, о чем они говорят, когда они относятся к "родовому" типу. Я думаю, что терминология на самом деле относится к списку <T> , что и есть тип в его общей форме. Список <String> является специализацией общего списка <T> .
Если они назвали его "параметром (-ами) типа", люди смутили бы его с параметрами типа Type.
Кроме того, ArrayList не является "общим". Он ТОЛЬКО работает с типами объектов. Если вы попросите его что-то, оно даст вам ссылку на объект. Это очень специфическое поведение.
Я не являюсь "родным" английским спикером, поэтому я могу ошибаться, но точка "Generics" заключается в том, что типы Define Generics, не так ли?
Класс, который принимает объекты, не является общим, он очень специфически принимает тип, который сам по себе является общим типом. С другой стороны, общий класс может использоваться с любым конкретным типом.
Поскольку вы создаете "общий" код, который будет работать на любом типе (в пределах ограничений, которые вы указываете) тем же способом...
Хороший пример, с которым вы знакомы, - это оператор "Добавить" - это всего лишь любой язык... он может "добавлять" целые числа, поплавки, удваивания, десятичные знаки, двоичные файлы, шестнадцатеричные элементы, независимо от того, являются ли они подписанными, незашифрованными, сколько бит, и т.д.