9.4.4 泛型方法与方法重载

9.4.4 泛型方法与方法重载

因为泛型既允许设定通配符的上限,也允许设定通配符的下限,从而允许在一个类里包含如下两个方法定义:

1
2
3
4
5
6
7
8
public class MyUtils{
public static <T> void copy(Collection<T> dest Collection<? extends T> src){
...
}// 1号代码
public static <T> T copy (Collection<? super T> dest, Collection<T> src){
...
}//2号代码
}

上面的MyUtils类中包含两个copy方法,这两个方法的参数列表存在一定的区别,但这种区别不是很明确:这两个方法的两个参数都是Collection对象,前一个集合里的集合元素类型是后一个集合里集合元素类型的父类。如果只是在该类中定义这两个方法不会有任何错误,但只要调用这个方法就会引起编译错误。例如,对于如下代码:

1
2
3
List<Number> ln =new ArrayList<>();
List<Integer> li = new ArrayList<>();
copy(ln,li);//3号代码

上面程序中3号代码部分调用copy方法,但这个copy方法既可以匹配1号copy方法,此时泛型T表示的类型是Number;也可以匹配2号copy方法,此时泛型T表示的类型是Integer。编译器无法确定这行代码想调用哪个copy方法,所以这行代码将引起编译错误。