了解Javagenerics。 输入参数约定

最常用的类型参数名称是:

E – Element(Java Collections Framework广泛使用)

K – 钥匙

N – 数字

T型

V – 价值

S,U,V等 – 第2,第3,第4类型

我似乎不太清楚每个字母到底对应的是什么。 我知道每个字母只代表一个惯例,但第二,第三和第四类是什么意思? 我什么时候应该用什么? 在他们的官方教程网站上,它没有提供进一步的信息。

一些例子:

  • Map :地图通常将V值分配给K eys。 这些是特殊类型,因此在这里使用。
  • List :列表包含E 。 它们被称为元素是一种惯例。 另一方面, T也可以在这里接受。
  • Formatter :格式化程序可以格式化任何Tforms。 它不是一个元素,也不是一个键,也不是一个值,所以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); } 

如果其他一切都不尽如人意,那么就把它称之为它。