最近,当我遇到这段代码时,我正在阅读oracle collection教程中的以下代码。
public static <E> Set<E> removeDups(Collection<E> c) {
return new LinkedHashSet<E>(c);
}
我无法理解返回值为什么
<E> Set<E> and not just Set<E> ?
答案 0 :(得分:7)
实际上,返回类型只是Set<E>
。
另一个<E>
表示这是一个通用方法,并声明E
是泛型的参数。如果没有这个<E>
,编译器会认为E
是一个现有的类,并会尝试找到它(如果没有名为E
的类在范围内,则会产生错误。)
答案 1 :(得分:2)
只是Set
,一个类型为E
的元素更加精确。返回类型前面的额外<E>
是该方法的类型声明,指定类型<E>
仅在此特定方法的范围内使用 - 不要与类混淆'type参数,如下所示:
public class Example<E> {
在上面的代码片段中,类型参数<E>
对于类中的所有方法都是可见的,而类型声明(如问题中的类型声明)仅在该方法中可见。
答案 2 :(得分:2)
返回类型为Set<E>
而不是<E> Set<E>
。第一个<E>
声明泛型类型变量E
,而附加到集合类的其他<E>
使用该声明。
答案 3 :(得分:0)
E可能是一个班级。通过返回<E> Set<E>
,您声明E是通用中的参数。
这是一个静态函数,因此没有E的基本定义。
答案 4 :(得分:0)
是的,第一个似乎有点奇怪。思考第一种方法的一种方式是它说(或提醒你)编译器将根据传入的Collection的类型找出E本身,而你,用户,不要我需要明确告诉它E是什么。