了解Javagenerics。 输入参数约定
最常用的类型参数名称是:
E – Element(Java Collections Framework广泛使用)
K – 钥匙
N – 数字
T型
V – 价值
S,U,V等 – 第2,第3,第4类型
我似乎不太清楚每个字母到底对应的是什么。 我知道每个字母只代表一个惯例,但第二,第三和第四类是什么意思? 我什么时候应该用什么? 在他们的官方教程网站上,它没有提供进一步的信息。
一些例子:
-
Map
:地图通常将V
值分配给K
eys。 这些是特殊类型,因此在这里使用。 -
List
:列表包含E
。 它们被称为元素是一种惯例。 另一方面,T
也可以在这里接受。 -
Formatter
:格式化程序可以格式化任何T
forms。 它不是一个元素,也不是一个键,也不是一个值,所以T
在这里是正确的字母。 -
Triplet
:任意类型的三元组。 由于类型定义对以后将填充的类型一无所知,因此它仅使用T
表示第一种类型,然后按字母顺序使用下一个字母。
我强烈建议使用更长的名称,尤其是当您有多个类型参数时。
public class MyMap {...}
如果您坚持约定,则可能需要在名称的末尾添加“类型”,例如
public class MyMap {...}
(虽然我更喜欢没有后缀的名字。名称应该是UpperCamelCase
)
如您所知,这些字母本身并不意味着什么,只是使阅读代码更容易的惯例。 “第2,第3和第4类型”位只是意味着当你有一个带有多个参数的参数化类型时,你应该调用那些参数S,T,U,V等。例如
class MyClass { }
是一个有三个类型参数的类。
显然你不必使用S,T和U.如果可以使用更有意义的约定,那么你应该这样做,例如
class Car { }
可以是车轮,发动机和油漆类型参数化的Car类。
编辑:正如另一个答案指出的那样,更好的是:
class Car { }
我似乎不太清楚每个字母到底对应的是什么。 我知道每个字母只代表一个惯例,但第二,第三和第四类是什么意思?
你不“完全理解每个字母对应的内容”的原因是单字母类型参数名称的使用是一种非正式的约定。 这些字母没有也没有固定的含义。 您应该阅读javadoc(以及必要时的代码)以确定字母在类的上下文中的含义。 在大多数情况下,代码作者都有某种意义。 试一试。
我什么时候应该用什么?
如果您遵循的是关于此主题的说明的编码标准,那么就按照它说的做。 除此以外:
- 尝试与您现有代码库的新兴约定保持一致, 如您所见
- 使用你的常识,并做出最可读的代码。
在他们的官方教程网站上,它没有提供进一步的信息。
那是正确的。
“官方”Java风格指南文档尚未更新约10年。 一方面,令人遗憾的是Sun / Oracle不再将风格约定正式化为其角色。 另一方面,我可以理解为什么他们不这样做。 (对Sun来说没有“价值”,所涉人员的潜在恶化根本就不值得。如果你曾经参与其中一个关于“正确”放置大括号,空格等的无谓辩论。 ,等等,你知道我的意思。)
我通常只是将generics类型表示为类名:
abstract class DAO { abstract Entity findById(Id id); }
IMO,你的代码应该是语义几乎到了读取句子而不是代码的程度。 对我来说,这不是非常易读或语义:
abstract class DAO { abstract E findById(I id); }
如果其他一切都不尽如人意,那么就把它称之为它。