Как статически типизированные языки обходятся без генериков? - PullRequest
2 голосов
/ 07 октября 2010

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

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

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

Ответы [ 5 ]

2 голосов
/ 07 октября 2010

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

Однако массивы (списки) обрабатываются как составные типы, а не как один тип. Например, у вас может быть массив шорт, но вы не можете обращаться с ним так же, как с массивом символов или даже с длинными.

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

1 голос
/ 07 октября 2010

Загрузите Java 1.4 или 1.3 и попробуйте сами.

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

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

.
0 голосов
/ 01 ноября 2010

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

Я думаю, то же самое касается VB.Net.

0 голосов
/ 01 ноября 2010

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

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

0 голосов
/ 01 ноября 2010

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

...