冒着成为村里白痴的风险,有人可以向我解释为什么仿制药被称为仿制药吗?我理解它们的用法和好处,但是如果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引入泛型之后开始编程,所以我不记得他们之前的时间。但还是......
感谢任何帮助。
答案 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)
我不是“本土”英语演讲者,所以我可能错了,但“泛型”的意思是定义泛型类型,不是吗?