泛型类型参数中的 T、U、V 惯例是从哪里来的?

7

Java、C# 和 TypeScript (即 Sun/Hejlsberg 语言家族)使用 TUV 等来表示泛型类型参数。这是因为 T 代表 "Type",而 UV 则在字母表中跟随 T

另一方面,Scala 使用 ABC 等,而 OCaml 和 Haskell 使用 abc

这些约定从哪里来?是因为函数式编程语言更接近于数学证明,其中惯例使用 αβγ 吗?


类似但并未回答我的问题:C# 泛型命名约定的起源是什么?.


我相信这一切始于T成为模板的简写(源自C ++)。然而在这里无法回答这个问题,这就是为什么我投票关闭它的原因。 - MakePeaceGreatAgain
4
我猜 T 代表 类型,而 UV 则是英文字母表中的下一个字母(当我们需要多个通用类型时)。 - Dmitry Bychenko
在地图上,通常是 <K,V> 表示键和值。我想这取决于语义。 - sjahan
1
Java中的List、Set和Collections使用<E>。我猜它代表“Entry”。因此,在Java中,他们至少试图选择泛型参数表示的缩写:Collection<E>表示entry,Map<K,V>表示key和value,Comparator<T>表示type。编辑:<E>实际上代表“element”。 - user6073886
1
首先,StackOverflow并不是一个好的地方来寻求链接和邮件列表,而是一个提出具体编程问题并展示实际问题的地方。无论如何,我猜这样的列表甚至不存在,它只是随着时间的推移而演变。 - MakePeaceGreatAgain
显示剩余2条评论
1个回答

12
在标准的Java SE API中,设计者通常选择与类型参数的含义/目的相关的单字母标识符:
  • Iterator<T> - javadoc,其中的T表示类型。其他示例包括ListIterator<T>Iterable<T>Comparable<T>Comparator<T>Class<T>
  • Collection<E> - javadoc,其中的E表示元素。其他各种集合类和接口都使用了E
  • Map<K,V> - javadoc,其中的K表示键,V表示值。
  • Enum<E> - javadoc,其中的E表示枚举。
这些倾向于证明您关于普遍存在TUV约定的说法是不正确的,至少对于Java而言是如此。显然,在缺乏具体指导的情况下,一些个人设计者将采用明显的扩展来使用T(请参见下面的链接),但这似乎是个人选择的结果。(而且这些团队可能认为这不值得讨论。)
(如果您想进行全面搜索,请访问每个javadoc索引A-Z页面,并搜索其中所有"<"出现的情况。)

我希望能找到一个旧的讨论/提交/邮件列表的链接,讨论了第一次使用该约定的情况。

就Java而言,我觉得您不会找到这样的东西。讨论和邮件列表将是私人的,当泛型与上述所有示例一起添加到语言中时,Java源代码仍然是封闭的。
@Lew Bloch已经找到了一些示例(请参见下面),它们是在Java 8中作为流支持的一部分添加到Java SE中的。我断言,这不能证明存在普遍的模式或约定,并且大量的现有类都可以证明这一点。
其他关于普遍模式或约定的负面证据:

最后,JLS (JLS 6.1) 建议:

类型变量名称应简洁(如果可能的话,使用单个字符),并具有启示性,不应包括小写字母。这样可以轻松区分类型参数与普通类和接口。

容器类型应使用E作为其元素类型的名称。映射应使用K作为其键的类型,V作为其值的类型。对于任意异常类型,应使用X。我们在没有更具体的类型来区分它时,使用T作为类型。(这通常是泛型方法的情况。)

如果有多个指定任意类型的类型参数,则应使用字母表中与T相邻的字母,例如S或者,可以使用数值下标(例如T1T2)来区分不同的类型变量。在这种情况下,所有具有相同前缀的变量都应带有下标。

简而言之,JLS并没有明确提到UV,但提供了其他替代方案。


1
这些通常推翻了你的断言,即不存在T、U、V约定…… 实际上确实存在这样的约定。 对于一般情况下没有特殊语义的情况,请使用“T” et seq. 作为泛型集合中的元素类型,传统上使用“E”。对于键值对,则是“K”和“V”。对于其他特殊语义,字母可以起到提示作用:例如“L”和“R”表示“左”和“右”。 - Lew Bloch
我在谈论一种惯例,即使用以T开头的字母序列...就像OP所假设的那样。你能指出标准Java SE类使用>>那个<<惯例的例子吗? - Stephen C
1
我在谈论 T, U. 还有 V. "et seq." 意思是 "及其后续内容"。这是一个标准缩写。我看到很多专业代码中使用了 T, U. 和 V。你读过 Java 教程吗?它列出了这些(" S,U,V等-第二,第三,第四类型",位于 "类型参数命名约定" 下)https://docs.oracle.com/javase/tutorial/java/generics/types.html。我建议阅读这份文档;它非常详尽。 - Lew Bloch
现在,任何人都可以查找这些内容,但是你很欢迎,我已经为你做了研究。https://docs.oracle.com/javase/8/docs/api/java/util/function/BiConsumer.html https://docs.oracle.com/javase/8/docs/api/java/util/function/BiPredicate.html https://docs.oracle.com/javase/8/docs/api/java/util/function/BiFunction.html。而且更广泛的社区也在使用它。例如,https://dzone.com/articles/introduction-generics-java-%E2%80%93-0中的`FirstType<T, U>示例和https://en.wikibooks.org/wiki/Java_Programming/Generics中的Repository<T, U>`等等... - Lew Bloch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接