我正在阅读来自here的Set接口,其中下面的代码是一个从系列中删除重复项的通用方法。
我的问题是**< E>**
之后静态Set<E>
放置的是什么?
我的意思是Set<E>
不够吗?为什么<E>
有两次?
public static <E> Set<E> removeDups(Collection<E> c) {
return new LinkedHashSet<E>(c);
}
答案 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)
这只是方法中使用的泛型类型。使用泛型类型的静态方法必须在返回类型之前指定该类型。