我从这里阅读了关于 Set 接口的内容,下面的代码是一个从集合中删除重复项的通用方法。
我的问题是**< E>**
在 static before 之后放置的是什么Set<E>
?
我的意思是这还 Set<E>
不够吗?为什么<E>
有两次?
public static <E> Set<E> removeDups(Collection<E> c) {
return new LinkedHashSet<E>(c);
}
我从这里阅读了关于 Set 接口的内容,下面的代码是一个从集合中删除重复项的通用方法。
我的问题是**< E>**
在 static before 之后放置的是什么Set<E>
?
我的意思是这还 Set<E>
不够吗?为什么<E>
有两次?
public static <E> Set<E> removeDups(Collection<E> c) {
return new LinkedHashSet<E>(c);
}
这意味着这个方法声明了一个类没有定义的泛型参数类型;在这种情况下,您必须在返回类型之前声明参数类型(即使这个“返回类型”是void
)。
这样想吧。删除初始<E>
. 您的声明将变为:
public static Set<E> removeDups(Collection<E> c)
这是什么E
?除非是类本身定义的泛型参数类型,否则只能是现有类。
因此这种语法。它允许您定义用于方法签名的通用参数。
这**<E>**
是一个泛型类型。泛型类型定义为
泛型类型是通过类型参数化的泛型类或接口。下面的 Box 类将被修改以演示该概念。关联
关于您与<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 和本课的其余部分中看到这些名称。
它只是方法中使用的泛型类型。使用泛型类型的静态方法必须在返回类型之前指定该类型。