当前位置: 首页 > 面试题库 >

泛型类型参数的T,U,V约定从何而来?

房唯
2023-03-14
问题内容

的Java,C#和打字稿(亦称语言的太阳/ Hejlsberg家庭)使用TUV等来表示泛型类型参数。从表面上看,这是因为T代表“
Type”,U然后V跟随T字母。

在另一方面,Scala的使用ABC等,和OCaml中和Haskell的使用abc

这些约定从何而来?难道是因为函数式语言更接近数学证明,在那里αβγ被用约定?


问题答案:

在标准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(请参阅下面的链接),但这似乎是个体选择的结果。(这些团体可能会认为这不值得讨论。)

(如果要进行详尽搜索,请访问每个javadocs索引AZ页,然后在其中搜索所有出现的“ <”。)

我希望链接到最初讨论该约定的旧讨论/提交/邮件列表。

对于Java,我怀疑您会发现这一点。讨论和邮件列表将是私有的,并且在将泛型以及上述所有示例添加到Java语言后,Java源代码仍然关闭。

@Lew布洛赫已经发现了几个例子(见下文)的TUV在加入到Java SE中的Java
8作为流支持的一部分的API。我断言这并不能证明是一种通用模式,并且大量先前存在的类都不能证明这一点。

一般模式或惯例的其他负面证据:

  • http://cr.openjdk.java.net/~alundblad/styleguide/index-v6.html#toc-type-variables中没有提及UV
  • http://docs.oracle.com/javase/tutorial/java/generics/types.html其中建议使用的SUV作为第二,第三和第四类型参数。(不UVW…)

最后,JLS(JLS
6.1
)建议:

类型变量名称应精简(如果可能,应使用单个字符),但应令人回味,并且不应包含小写字母。这使得区分类型参数与普通类和接口变得容易。

容器类型应使用名称E作为其元素类型。映射应使用K其键V的类型和其值的类型。该名称X应用于任意异常类型。T每当类型没有更具体的区别时,我们都会使用type。(在通用方法中通常是这种情况。)

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

总之,UV没有明确的提到JLS,但其他的替代品。



 类似资料:
  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 我有以下java示例类: 它正在生成编译器警告: 类型安全:从捕获#1-of?扩展对象到T的未检查强制转换 我完全可以得到精确的T对象,如果我这样做: 它完全知道这是T型的。 为什么我不能创建该类的新实例?我怎样才能修复它? (我没有查找类型为“Add@SuppressWarnings(“unchecked”)”的响应)

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 问题内容: 我有一个泛型类。在一种方法中,我想获取类型T的类实例,但是我不能调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是将type参数的传递给泛型类型的构造函数,例如

  • 问题内容: 是否有将通用类型参数约束为 任何 类型范围的语法或解决方法? 我知道您可以将一个类型限制为 所有 类型的范围(即逻辑): 是否有逻辑版本,例如: 如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法? 在某些情况下,一个示例用例可能是: 人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下: 编辑: 我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体