考虑这个通用方法取自Effective Java:
// Generic method
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<E>(s1);
result.addAll(s2);
return result;
}
而这个方法来练习上面的通用方法:
// Simple program to exercise generic method
public static void main(String[] args) {
Set<String> guys = new HashSet<String>(
Arrays.asList("Tom", "Dick", "Harry"));
Set<String> stooges = new HashSet<String>(
Arrays.asList("Larry", "Moe", "Curly"));
Set<String> aflCio = union(guys, stooges); //What does the type parameter help here?
System.out.println(aflCio);
}
如果我们没有提供类型参数,即<E>
在修饰符和返回类型之间,我们仍然可以不将aflCio
类型的引用分配给Set<String>
联合方法的返回值吗?在这里购买我们的类型参数是什么?
我很难理解以下段落:
泛型方法的一个值得注意的特性是,您不需要像调用泛型构造函数时那样显式指定类型参数的值。编译器通过检查方法参数的类型来计算类型参数的值。在上面的程序中,编译器看到 union 的两个参数都是 Set 类型,所以它知道类型参数 E 必须是 String。这个过程称为类型推断。
我们不是将返回类型中的类型参数提到为Set<E>
. 那么为什么我们需要再次添加它呢?