【发布时间】:2010-10-07 09:50:14
【问题描述】:
我很好奇哪些静态类型语言不支持泛型 (以及在较小程度上历史上哪些语言没有泛型),以及它们如何处理它。
用户会到处投吗?是否有一些用于基本集合(例如列表和字典)的特殊调味料,可以使这些类型成为通用类型?
为什么这些语言没有泛型?是为了避免潜在的复杂性还是其他原因?
【问题讨论】:
标签: generics language-design static-typing
我很好奇哪些静态类型语言不支持泛型 (以及在较小程度上历史上哪些语言没有泛型),以及它们如何处理它。
用户会到处投吗?是否有一些用于基本集合(例如列表和字典)的特殊调味料,可以使这些类型成为通用类型?
为什么这些语言没有泛型?是为了避免潜在的复杂性还是其他原因?
【问题讨论】:
标签: generics language-design static-typing
C——以及历史上的 C++,在它被称为 C++ 之前——要求您手动将“泛型”类型扩展为非泛型(即 C 预处理器宏等效于 C++ 模板)或转义类型系统(即 void 指针) .
但是,数组(列表)被视为复合类型而不是单一类型。例如,您可以有一个 short 数组,但不能将其视为 chars 数组甚至 long 数组。
这在 C 中并不是一个真正的大问题,虽然有时很不方便。放在上下文中,它确实代表了 40 年前的权衡。
【讨论】:
下载 java 1.4 或 1.3 并自己尝试。
提示:是的,可能会有很多演员表
如何处理:我见过一个组织强制任何 API 不使用集合(在方法声明中)而是使用数组以避免用户混淆。另一种方法是创建一个特定的集合类,它只适用于某些类,例如 StringList 等
【讨论】:
List,我宁愿使用MyObj[]。
对此的简短回答是 C++ 模板。与限制现有类型的泛型不同,模板是在编译时生成新类型的一种方式。像大多数代码生成解决方案一样,它不是一个非常令人满意的解决方案:因此我们继续前进。
【讨论】:
Pascal 的原始形式不支持泛型。如果你想要一个链表,你需要为你的特定类型创建一个(例如 IntLinkedList)。
现代版本的 Pascal(例如 ObjectPascal/Delphi)可能提供某种形式的泛型。
【讨论】:
C# 直到 v2.0 才支持泛型。所以是的,那么你需要大量来自 Object 的选角。
我想 VB.Net 也是如此。
【讨论】: