为什么泛型称为泛型?

时间:2008-11-21 15:58:05

标签: generics language-agnostic semantics

冒着成为村里白痴的风险,有人可以向我解释为什么仿制药被称为仿制药吗?我理解它们的用法和好处,但是如果definition of generic是“通用”而且通用集合是类型安全的,那么为什么这不是用词不当呢?

例如,ArrayList可以保存任何对象:

ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);

虽然类型字符串的泛型集合只能包含字符串:

var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");

我不清楚为什么它被称为“通用”。如果答案是“......这使得设计类和方法可以推迟一个或多个类型的规范,直到通过客户端代码声明和实例化类或方法。”来自here,那么我认为这是有道理的。也许我有这种精神失误,因为我只是在Java引入泛型之后开始编程,所以我不记得他们之前的时间。但还是......

感谢任何帮助。

9 个答案:

答案 0 :(得分:20)

“Generic”正在谈论实施。您编写了一个适用于任何类型的“通用”列表实现,而不必为您要使用的每种类型编写特定的实现。

答案 1 :(得分:13)

我认为对这类问题的正确答案几乎总是“历史原因,主要是”。泛型也可以被称为“方案”或“类”或“类型族”或“属”或“类型函数”或“静态”或“希腊类型”或任何一百万种其他东西。很久以前有人决定使用“通用”这个词,它就卡住了。

Java意义上的“通用”至少可以追溯到20世纪70年代中期。美国国防部正在为其新的编程语言(将成为ADA)修改一份需求文档。早期的草案("Woodenman",1975年8月)说:

  

可扩展语言中需要编译时间参数,以允许指定通用过程和数据结构(如堆栈和队列),而无需重复每种元素类型的定义。

这是文档中“泛型”的唯一用法。我不清楚它是如何打算的。但是到了1977年7月("Tinman"),关于仿制药的内容已经整整一段了,而且这个术语显然具有特定的含义:

  

12D。一般定义

     

应该可以定义具有在每次调用时在转换期间实例化的参数的函数,过程和类型。这些参数可以是任何定义的标识符(包括变量,函数或类型的标识符),表达式或语句。与所有其他参数一样,这些参数应在调用的上下文中进行评估。

到1978年6月("Steelman"),这是行话;在文档的其他部分中还有“泛型”一词的其他用法,明确提到了这一特性。在完成的语言中,generic是一个保留字。

这些文件的作者列在网站上,大概大部分仍在。打电话给他们并问他们记得什么是很好的。


我在学术界发现的最早似乎相关的“通用”用法是在Robin Milner的"A theory of type polymorphism in programming"(1978)中(并且他觉得有必要通过“泛型”来解释他的意思,所以它不可能当时在学术界普遍使用):

  

所以这是 map 的泛型类型,也就是说,在此声明范围内的任何 map 的出现都必须分配一些此类型的替换实例。

“通用类型变量”成为CS行话。

答案 2 :(得分:3)

bool Equals(int x, int y)

上面的方法只能比较整数,所以我们可以说它是专用的来比较整数。

bool Equals<T>(T x, T y);

上述方法可以比较任何类型的值,因此我们可以说它对于任何特定类型都不是专用 - 它是泛型

答案 3 :(得分:1)

我不想进入语言的语义(英语,而不是java),并且冒着用同义反复回答你的风险;一般的方法被称为泛型,因为正如你所说,它可以用于一般意义上,它没有特定的类型,一般可以使用

答案 4 :(得分:1)

好的,带着一点点盐,因为我 完全 猜测,但我想知道它是否可能是“生成类型”的混蛋。 / p>

从概念上讲,当您将List专门化为List&lt; String&gt ;,它生成一个新类型。至少,这是它在C ++模板和C#泛型中的工作方式。

在Java中,由于编译器使用类型擦除丢弃了参数化,实际上 不会 生成一个新的专用类型,所以谁知道?

我想你可以说Java实现了生成类型的通用版本:)


ON EDIT:

这是另一种观点......

类型列表&lt;字符串&gt;当他们提到“通用”类型时,并不是他们所说的。我认为术语实际上是指List&lt; T> type,类型以其通用形式存在的方式。列表与LT;字符串&gt;是通用List&lt;的专业化。 T&gt;。

答案 5 :(得分:0)

如果他们称之为“类型参数”,人们会将其与Type类型的参数混淆。

此外,ArrayList不是“通用的”。它仅适用于对象类型。如果你问它什么,它会给你一个对象参考。这是一种非常具体的行为。

答案 6 :(得分:0)

获取对象的类不是通用的,它非常具体地采用类型,它本身就是泛型类型。另一方面,泛型类可以与任何特定类型一起使用。

答案 7 :(得分:0)

因为您正在以相同的方式创建能够在任何类型(在您指定的约束内)操作的“通用”代码...

你熟悉的一个很好的例子是Add运算符几乎是任何语言......它可以“添加”整数,浮点数,双精度数,小数,二进制数,十六进制数,无论它们是否已签名,未经编辑,有多少他们是等等...

答案 8 :(得分:-1)

我不是“本土”英语演讲者,所以我可能错了,但“泛型”的意思是定义泛型类型,不是吗?