【问题标题】:How do statically-typed languages deal without generics?如果没有泛型,静态类型语言如何处理?
【发布时间】:2010-10-07 09:50:14
【问题描述】:

我很好奇哪些静态类型语言不支持泛型 (以及在较小程度上历史上哪些语言没有泛型),以及它们如何处理它。

用户会到处投吗?是否有一些用于基本集合(例如列表和字典)的特殊调味料,可以使这些类型成为通用类型?

为什么这些语言没有泛型?是为了避免潜在的复杂性还是其他原因?

【问题讨论】:

    标签: generics language-design static-typing


    【解决方案1】:

    C——以及历史上的 C++,在它被称为 C++ 之前——要求您手动将“泛型”类型扩展为非泛型(即 C 预处理器宏等效于 C++ 模板)或转义类型系统(即 void 指针) .

    但是,数组(列表)被视为复合类型而不是单一类型。例如,您可以有一个 short 数组,但不能将其视为 chars 数组甚至 long 数组。

    这在 C 中并不是一个真正的大问题,虽然有时很不方便。放在上下文中,它确实代表了 40 年前的权衡。

    【讨论】:

      【解决方案2】:

      下载 java 1.4 或 1.3 并自己尝试。

      提示:是的,可能会有很多演员表

      如何处理:我见过一个组织强制任何 API 不使用集合(在方法声明中)而是使用数组以避免用户混淆。另一种方法是创建一个特定的集合类,它只适用于某些类,例如 StringList

      【讨论】:

      • “我看到一个组织强制任何 API 不使用集合(在方法声明中)而是使用数组以避免用户混淆。”是的,我在 Java 1.4 及之前的版本中做到了。如果没有特殊原因使用List,我宁愿使用MyObj[]
      【解决方案3】:

      对此的简短回答是 C++ 模板。与限制现有类型的泛型不同,模板是在编译时生成新类型的一种方式。像大多数代码生成解决方案一样,它不是一个非常令人满意的解决方案:因此我们继续前进。

      【讨论】:

      • @downvoter:为什么要投反对票?如果这里有错误,只有礼貌地告诉所有人是什么。
      • 我没有足够的知识来肯定地说这个,但我相信泛型是一种创建新类型的方法(也许你是在表达 java 泛型编译为从 / 到 Object 的转换并且只是限制你的只允许类型安全转换的代码(不包括非编译器转换和运行时/反射技巧),我认为这是一种错误的思考方式,而不是 java 在编译时生成类型和类型检查(通用编程)和然后抛出一些类型信息,(这应该由熟悉这些东西的人审查)。
      • 我也很确定泛型是 c++ 模板使用的一个子集。
      • 您在所有这些方面都错了。 (i) 泛型不会在编译时或任何其他时间生成代码,因此它们不会在任何时候创建新类型。因此,“生成类型”是错误的思考方式。 (ii) 泛型有几个 C+ 模板没有的特性,例如'super' 和 'extends' 和 ?,所以它们不可能是子集。
      【解决方案4】:

      Pascal 的原始形式不支持泛型。如果你想要一个链表,你需要为你的特定类型创建一个(例如 IntLinkedList)。

      现代版本的 Pascal(例如 ObjectPascal/Delphi)可能提供某种形式的泛型。

      【讨论】:

        【解决方案5】:

        C# 直到 v2.0 才支持泛型。所以是的,那么你需要大量来自 Object 的选角。

        我想 VB.Net 也是如此。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-22
          • 2016-09-26
          • 1970-01-01
          • 2011-12-30
          • 2011-02-09
          • 2011-02-11
          相关资源
          最近更新 更多