理解Java泛型.输入参数约定

bug*_*ode 20 java generics

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

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

K - 钥匙

N - 数字

T型

V - 价值

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

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

Rol*_*lig 26

一些例子:

  • Map<K, V>:地图通常会将元素分配VKeys.这些是特殊类型,因此在这里使用.
  • List<E>:列表包含Elements.这是一种惯例,它们被称为元素.另一方面,T这里也可以接受.
  • Formatter<T>:格式化程序可以格式化任何Type.它不是一个元素,也不是一个键,也不是一个值,所以T这里的正确字母也是如此.
  • Triplet<T, U, V>:任意类型的三元组.由于类型定义对稍后将填充的类型一无所知,因此它仅使用T第一种类型,然后按字母顺序使用下一个字母.


Sco*_*eld 8

我强烈建议使用更长的名称,尤其是当您有多个类型参数时.

public class MyMap<Key, Value> {...}
Run Code Online (Sandbox Code Playgroud)

如果你坚持一个约定,你可能想在名称的末尾添加"类型",比如

public class MyMap<KeyType, ValueType> {...}
Run Code Online (Sandbox Code Playgroud)

(虽然我更喜欢这个名字没有后缀.这个名字应该是UpperCamelCase)


Cam*_*ner 7

如您所知,这些字母本身并不代表任何内容,只是使阅读代码更容易的惯例."第2,第3和第4类型"位只是意味着当你有一个带有多个参数的参数化类型时,你应该调用那些参数S,T,U,V等.例如

class MyClass<S, T, U> {
}
Run Code Online (Sandbox Code Playgroud)

是一个有三个类型参数的类.

显然,你不具备使用S,T和U.如果然后可以使用更有意义的会议,你应该这样做,例如

class Car<W, E, P> {
}
Run Code Online (Sandbox Code Playgroud)

可以是车轮,发动机和油漆类型参数化的Car类.

编辑:正如另一个答案指出的那样,更好的是:

class Car<WheelType, EngineType, PaintType> {
}
Run Code Online (Sandbox Code Playgroud)