Как языки со статической типизацией обходятся без дженериков?

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

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

Почему у этих языков нет дженериков? Чтобы избежать возможных сложностей или других причин?


person Roman A. Taycher    schedule 07.10.2010    source источник


Ответы (5)


C - и исторический C ++, до того, как он назывался C ++ - требует, чтобы вы вручную расширили «общие» типы до не-универсальных (т. Е. Макрос препроцессора C, эквивалентный шаблонам C ++), или избегайте системы типов (т. Е. Недействительных указателей).

Однако массивы (списки) рассматриваются как составные типы, а не как отдельный тип. Например, у вас может быть массив коротких замыканий, но вы не можете рассматривать его так же, как массив символов или даже long.

В C это не такая уж большая проблема, хотя иногда и неудобно. Это действительно компромисс 40-летней давности, если рассматривать его в контексте.

person Community    schedule 07.10.2010

Скачайте java 1.4 или 1.3 и попробуйте сами.

Подсказка: да, вероятно, будет много кастингов

Как поступить: я видел организацию, заставляющую любой API использовать не коллекцию (в объявлении метода), а массив, чтобы не вводить пользователя в заблуждение. Альтернативой является создание определенных классов коллекции, которые работают только с определенным классом, например StringList и т. Д.

person nanda    schedule 07.10.2010
comment
Я видел организацию, заставляющую любой API использовать не коллекцию (в объявлении метода), а массив, чтобы не запутать пользователя. Да, я делал это в Java 1.4 и ранее. Если бы не было особых причин использовать List, я бы предпочел MyObj[]. - person Adrian Smith; 10.11.2010

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

person user207421    schedule 01.11.2010
comment
@downvoter: почему голос против? Если здесь есть ошибка, будет учтиво сказать, что это за ошибка. - person user207421; 03.11.2010
comment
Я недостаточно осведомлен, чтобы сказать это с уверенностью, но я считаю, что универсальные шаблоны - это способ создания новых типов (возможно, вы выражаете мнение, что универсальные Java-шаблоны компилируются для преобразования из / в объект, и просто ограничивают свой код, чтобы разрешить только безопасное приведение типов ( не включая литье компилятора и трюки времени выполнения / отражения), я думаю, что это своего рода неправильный способ думать об этом, в отличие от java, генерирующего типы во время компиляции и проверки типов (общее программирование), а затем выкидывает некоторую информацию о типе , (опять же, это должно быть проверено людьми, которые хорошо разбираются в этом материале). - person Roman A. Taycher; 08.11.2010
comment
Также я почти уверен, что дженерики - это подмножество использования шаблонов С ++. - person Roman A. Taycher; 08.11.2010
comment
Вы ошибаетесь по всем этим пунктам. (i) Обобщения не генерируют код во время компиляции или в любое другое время, следовательно, они никогда не создают новые типы. Ergo «порождающие типы» - неправильный способ думать об этом. (ii) У универсальных шаблонов есть несколько функций, которых нет в шаблонах C +, например 'super', 'extends' и?, поэтому они не могут быть подмножеством. - person user207421; 09.11.2010

Паскаль в его первоначальном виде не поддерживал дженерики. Если вам нужен связанный список, вам нужно создать его для вашего конкретного типа (например, IntLinkedList).

Современные версии Паскаля (например, ObjectPascal / Delphi) могут предоставлять некоторую форму обобщений.

person Michael Ekstrand    schedule 01.11.2010

C # не поддерживал дженерики до версии 2.0. Так что да, тогда вам нужно было много кастинга от Object.

Думаю, то же самое и с VB.Net.

person Hans Kesting    schedule 01.11.2010