4

考虑这个泛型代码:

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>

4

6 回答 6

8

它们必须是有效的 Java 标识符(不一定只是注释中指出的单个字母),从技术上讲,您可以使用您喜欢的任何标识符,并且您的代码将编译并运行良好(当然,如果没有其他错误!)

不过,最好遵守约定 - 这往往是单个大写字母。一些常见的是E,和T,分别代表元素、类型、键和值 - 您的用例可能很适合这些类别之一,在这种情况下我会使用这些字母。在上面的例子中,类使用是因为它包含元素。KVCollectionE

于 2012-10-02T08:39:34.213 回答
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 typesparameters..

因此,对于Collection<String>,您的方法将如下所示:-]

   public void add (String x);  
   public Iterator<String> iterator();
于 2012-10-02T08:39:22.793 回答
0

EV是类型参数。它们不必是单个的大写字母——您可以使用 Java 中任何有效的标识符。

几乎每个人都对类型参数使用单个大写字母——这是几乎每个人都遵循的约定,所以我强烈建议你也这样做。

例如,您也可以这样做:

public class MyClass<Value> {
    Value v;
    setSomeValue(Value val) {
       v=val;
    }

    Value getSomeValue() {
        return v;
    }
 }
于 2012-10-02T09:21:47.067 回答
0

那些EV其他只是变量。他们只是建议在编写代码时该类型是未知的。这也通过对这么多类型的对象使用相同的类来简化工作。

这些可以从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

它们可以wildcards在 java 中定义。这些泛型主要用于创建一个适用于许多types而不需要casting.

于 2012-10-02T08:45:10.933 回答
0

我认为它们必须是字母。它们基本上是类名的占位符。所以如果你想实例化 MyClass 你可以做

new MyClass<String>();

这将用字符串替换代码中的所有 V。

本课有更多关于泛型的细节

引用本课

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

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
于 2012-10-02T08:37:55.803 回答
0

通常它们会这样做,但编译器会让您根据需要命名它们;与任何其他类型一样,因为它表示类型的通用名称。

约定是:

T——类型;最常用于自定义类

E——元素;用于收藏

K——键;用于地图

V——值;用于地图

于 2012-10-02T08:39:09.330 回答