方法签名中的<e>是什么?</e>

时间:2014-03-16 06:53:34

标签: java generics collections set linkedhashset

我正在阅读来自here的Set接口,其中下面的代码是一个从系列中删除重复项的通用方法。

我的问题是**< E>**之后静态Set<E>放置的是什么?

我的意思是Set<E>不够吗?为什么<E>有两次?

public static <E> Set<E> removeDups(Collection<E> c) {
    return new LinkedHashSet<E>(c);
}

3 个答案:

答案 0 :(得分:1)

这意味着此方法声明了一个类没有定义的泛型参数类型;在这种情况下,您必须在返回类型之前声明参数类型(即使此“返回类型”为void)。


以这种方式思考。删除最初的<E>。您的声明将成为:

public static Set<E> removeDups(Collection<E> c)

这里E是什么?除非它是由类本身定义的泛型参数类型,否则它只能是现有类。

因此这种语法。它允许您定义用于方法签名的通用参数。

答案 1 :(得分:1)

此处**<E>**是通用类型。通用类型定义为

  

泛型类型是参数化的泛型类或接口   超过类型。将修改以下Box类以进行演示   这个概念。 LINK

关于你与<E>相关的问题。可以在同一个教程

上找到它的一个很好的描述

类型参数命名约定

  

按照惯例,类型参数名称是单个大写字母。   这与变量命名约定形成鲜明对比   你已经了解并且有充分的理由:没有这个惯例,   很难说出一个类型变量之间的区别   和普通的类或接口名称。

     

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

 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 SE API和其他部分中看到这些名称   这一课。

答案 2 :(得分:0)

这只是方法中使用的泛型类型。使用泛型类型的静态方法必须在返回类型之前指定该类型。