2010-10-07 3 views
2

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

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

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

ответ

1

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

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

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

+0

«Я видел организацию, которая заставляла любой API не использовать коллекцию (в объявлении метода), а массив, чтобы избежать путаницы с пользователем». Да, я сделал это в Java 1.4 и раньше. Если не было особых причин использовать «Список», я предпочел бы использовать «MyObj []». –

2

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

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

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

0

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

+0

@ downvoter: почему нисходящий? Если здесь есть ошибка, то только вежливо сказать, что это такое. – EJP

+0

Я недостаточно осведомлен, чтобы сказать это с уверенностью, но я считаю, что генерики - это способ создания новых типов (возможно, вы выражаете мнение о том, что java generics компилируется для отбрасываний из/в Object и просто ограничивает ваш код, чтобы разрешать только безопасное литье типов (не считая кастования компилятора и трюков выполнения/отражения), я думаю, что это неправильный способ подумать об этом, а не о типах генерации Java при компиляции времени и типе (обобщенном программировании), а затем бросать некоторую информацию типа (опять же, это должно быть проверено людьми, которые хорошо знают это). –

+0

Также я уверен, что generics - это подмножество использования шаблона C++. –

0

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^