generics - 泛型为什么称为泛型?

  显示原文与译文双语对照的内容

有可能成为村里的白痴,有人可以向我解释为什么泛型被称为泛型? 我理解他们的使用和收益,但如果定义通用"常规"和泛型集合类型安全,那么为什么不是这个用词不当?

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


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

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


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

我只是不清楚为什么叫"通用"。 如果答案是"这使得设计类和方法成为可能,直到类或者方法被客户端代码声明和实例化后,才可以推迟一个或者多个类型的规范。"from ,那么我认为这是。 也许我有这种精神错乱,因为我只在Java引入泛型之后才开始编程,所以我以前不记得它们。 但是。

感谢你的帮助。

时间:

"通用"正在讨论实现。 你编写的单个"通用"列表实现可以使用任何类型,而不必为你想使用的每种类型编写特定的实现。

我认为对这样问题的正确答案几乎总是"历史原因,主要是"。 泛型也可以被称为"方案"或者"类"或者"类型族"或者"生成"或者"类型函数"或者"静态"或者"希腊文类型",或者任何其他东西。 很久以前有人决定使用"通用"这个词,而且它坚持。

"通用"在Java意义上至少追溯到 mid-1970s 。 美国 国防部为它的新程序语言( 什么会成为 ADA ) 磨练了一个需求文档。 早期草案( "woodenman",1975年08月 ) 表示:

编译时需要编译时参数以允许泛型过程和数据结构如堆栈和数据结构规范,而不需要重复每个元素类型的定义。

这是"通用"在文档中的惟一使用。 我不清楚它是如何被预期的。 但 1977年07月 ( "tinman" ) 有一整段泛型,显然和这个词意味着特定的东西:

12D 。泛型定义

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

由 1978年06月 ( "steelman" ) 成立专门术语;有词"通用"文件,很清晰地指此功能中其他章节的其他用途。 在完成的语言中,generic 是一个保留字。

这些文档的作者在网站上列出,并且大概还在附近。 打电话给他们并询问他们的记忆是很好的。


最早的有关使用"通用"我发现在学术界的罗宾米尔纳"编程中类型多态的一种理论" ( 1978 ) (和他觉得"通用"不得不解释一下他的意思,所以它不能当时已经在学术界常用的):

这是地图的泛型类型,也就是说,任何发生地图范围内这个声明必须分配一些替换这种类型的实例。

"通用类型变量became成为CS术语。


bool Equals(int x, int y)

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


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

上面的任何类型的方法可以比较值,所以我们可以说它不是任何特定类型的专门——这是通用 。

好的,带着这一粒盐,因为我完全猜测,但我怀疑这可能是一个 bastardization"生成类型"。

从概念上讲,当你将 List 专门化为列表 <字符串>时,它会生成一个新类型。 至少,它是在 C++ 模板和 C# 泛型中工作的。

在java,因为编译器参数化被丢弃的使用类型擦除,它实际上并不生成一个新的专门化类型,所以谁知道呢?

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


编辑时:

这是另一个观点。

类型列表 <字符串> 不是它们在引用"通用"类型时所说的。 我认为术语实际上是指列表 <> 类型,这就是类型在它的泛型形式中的存在。 List <String> 是泛型 List <T>的专用化。

如果他们称它为"类型参数( ),"人们会将它与类型类型的参数混淆。

同样,ArrayList不是"通用"。它只适用于对象类型。 如果你请求它,它将给你一个对象引用。 这是一个非常特殊的行为。

我不是"原生"英语演讲者,所以我可能错了,但"泛型"的要点是定义泛型类型,不是它?

我不想进入语言( 英语,不是 java )的语义,而在回答你的风险时,一般方法称为泛型,因为就像你所说的那样,它可以使用一般意义,它不具有特定类型,它可以使用

一个获取对象的类不是泛型的,它是一个类型的,它本身是一个泛型类型。 另一方面,泛型类可以与任何特定类型一起使用。

因为你正在创建"通用"代码,它可以相同的方式操作任何类型( 在约束内指定) 。

你熟悉的一个很好的例子是添加运算符几乎是任何语言。 它可以"添加"个整数,浮点数,双精度,小数,binarys,hexadecimals,不管它们是有符号的,unsogned,多少位,等等 。

...