了解Java通用类型

时间:2012-10-02 08:36:52

标签: java generics

考虑这个泛型代码:

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>

6 个答案:

答案 0 :(得分:8)

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

虽然坚持惯例很好 - 这往往是单个大写字母。一些常见的分别是ETKV,分别代表元素,类型,键和值 - 您的用例可能很适合其中一个类别,在这种情况下,我会使用这些字母。对于上面的示例,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 typesparameters ..

因此,对于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)

那些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

他们在java中可以定义为wildcards。这些泛型主要用于制作单个类,适用于许多types而不需要casting

答案 5 :(得分:0)

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

几乎每个人都使用单个大写字母作为类型参数 - 这是几乎每个人都遵循的惯例,所以我强烈建议你这样做。

你也可以这样做:

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

    Value getSomeValue() {
        return v;
    }
 }