的Java,C#和打字稿(亦称语言的太阳/ Hejlsberg家庭)使用T
,U
,V
等来表示泛型类型参数。从表面上看,这是因为T
代表“
Type”,U
然后V
跟随T
字母。
在另一方面,Scala的使用A
,B
,C
等,和OCaml中和Haskell的使用a
,b
和c
。
这些约定从何而来?难道是因为函数式语言更接近数学证明,在那里α
,β
和γ
被用约定?
在标准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
手段枚举。这些往往反驳你的断言,有一个一般的(普遍)T
,U
,V
约定,至少为Java。显然,在没有具体指导的情况下,一些个体设计师将采用明显的指导扩展T
(请参阅下面的链接),但这似乎是个体选择的结果。(这些团体可能会认为这不值得讨论。)
(如果要进行详尽搜索,请访问每个javadocs索引AZ页,然后在其中搜索所有出现的“ <”。)
我希望链接到最初讨论该约定的旧讨论/提交/邮件列表。
对于Java,我怀疑您会发现这一点。讨论和邮件列表将是私有的,并且在将泛型以及上述所有示例添加到Java语言后,Java源代码仍然关闭。
@Lew布洛赫已经发现了几个例子(见下文)的T
,U
,V
在加入到Java SE中的Java
8作为流支持的一部分的API。我断言这并不能证明是一种通用模式,并且大量先前存在的类都不能证明这一点。
一般模式或惯例的其他负面证据:
U
和V
。S
,U
并V
作为第二,第三和第四类型参数。(不U
,V
,W
…)最后,JLS(JLS
6.1
)建议:
类型变量名称应精简(如果可能,应使用单个字符),但应令人回味,并且不应包含小写字母。这使得区分类型参数与普通类和接口变得容易。
容器类型应使用名称
E
作为其元素类型。映射应使用K
其键V
的类型和其值的类型。该名称X
应用于任意异常类型。T
每当类型没有更具体的区别时,我们都会使用type。(在通用方法中通常是这种情况。)如果有多个表示任意类型的类型参数, 则应使用
T
在字母表中相邻的字母,例如S
。或者,
可以使用数字下标(例如T1
,T2
)来区分不同类型的变量。在这种情况下,所有带相同前缀的变量都应下标。
总之,U
而V
没有明确的提到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参数的传递给泛型类型的构造函数,例如
问题内容: 是否有将通用类型参数约束为 任何 类型范围的语法或解决方法? 我知道您可以将一个类型限制为 所有 类型的范围(即逻辑): 是否有逻辑版本,例如: 如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法? 在某些情况下,一个示例用例可能是: 人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下: 编辑: 我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体