考虑这个泛型代码:
interface Collection<E> {
public void add (E x);
public Iterator<E> iterator();
}
这一个:
public class MyClass<V> {
V v;
setSomeValue(V val) {
v=val;
}
V getSomeValue() {
return v;
}
}
我的问题:
用尖括号做那些字母:
<V>
和<E>
有特定的意义。
我可以使用任何英文字母。也就是说
<A>
或<Q>
?
答案 0 :(得分:8)
它们必须是有效的Java标识符(不一定只是注释中指出的单个字母),从技术上讲,您可以使用任何您喜欢的标识符,并且您的代码将编译并运行正常(如果没有其他错误当然!)
虽然坚持惯例很好 - 这往往是单个大写字母。一些常见的分别是E
,T
,K
和V
,分别代表元素,类型,键和值 - 您的用例可能很适合其中一个类别,在这种情况下,我会使用这些字母。对于上面的示例,Collection
类使用E
,因为它包含元素。
答案 1 :(得分:1)
interface Collection<E> {
public void add (E x);
public Iterator<E> iterator();
}
定义这样的接口意味着你告诉编译器,你可以创建任何类型的这个接口的引用......但是,你必须只使用letters
来表示泛型类型..
理想情况下,您不应仅使用 T, E, or V
约束。您可以使用其中的任何一种..但是,如果您遵循某些,您的代码更具可读性约定强> ..
K - Key, V - Value
..喜欢这个..
因此,上述界面的引用可以是: -
Collection<String>, Collection<Integer>, Collection<YourCustomObject>
无论您使用何种类型,它都会自动反映在您的method return types
和parameters
..
因此,对于Collection<String>
,您的方法将如下所示: - ]
public void add (String x);
public Iterator<String> iterator();
答案 2 :(得分:0)
我认为他们必须是信件。它们基本上是类名的占位符。所以,如果你想实例化MyClass,你可以做
new MyClass<String>();
这将用String替换代码中的所有V。
This课程详细介绍了泛型
引用本课
最常用的类型参数名称是:
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types
答案 3 :(得分:0)
通常它们会这样做,但编译器允许您根据需要命名它们;与任何其他类型一样,因为它表示类型的通用名称。
惯例是:
T型;最常用于自定义类
电子元素;用于收集
K - 键;用于地图
V值;用于地图
答案 4 :(得分:0)
那些E
或V
或其他只是变量。他们只是建议在编写代码时类型是未知的。这也通过对很多类型的对象使用相同的类来简化作业。
可以从http://docs.oracle.com/javase/tutorial/java/generics/index.html
The most commonly used type parameter names are:
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types
他们在java中可以定义为wildcards
。这些泛型主要用于制作单个类,适用于许多types
而不需要casting
。
答案 5 :(得分:0)
E
,V
等是类型参数。它们不必是单个大写字母 - 您可以在Java中使用任何有效的标识符。
几乎每个人都使用单个大写字母作为类型参数 - 这是几乎每个人都遵循的惯例,所以我强烈建议你这样做。
你也可以这样做:
public class MyClass<Value> {
Value v;
setSomeValue(Value val) {
v=val;
}
Value getSomeValue() {
return v;
}
}