Java允许设定通配符的下限:<? super Type>,这个通配符表示它必须是Type本身,或是Type的父类,下面程序采用设定通配符下限方式改写了前面程序:
1 import java.util.List; 2 import java.util.ArrayList; 3 import java.util.Collection; 4 5 public class MyUtils{ 6 //下面dest集合元素的类型必须与src集合元素的类型相同,或是其父类 7 public static <T> T copy(Collection<? super T> dest, Collection<T> src){ 8 T last = null; 9 for(T ele : src){ 10 last = ele; 11 dest.add(ele); 12 } 13 return last; 14 } 15 16 public static void main(String[] args){ 17 List<Number> ln = new ArrayList<>(); 18 List<Integer> li = new ArrayList<>(); 19 li.add(5); 20 //此处可准确地知道最后一个被复制的元素时Integer类型 21 //与src集合元素的类型相同 22 Integer last = copy(ln, li); 23 System.out.println(ln); 24 } 25 } View Code这样可以保证程序可以推断出最后一个被复制的元素类型是Integer,而不是Number类型。
泛型方法与方法重载:
因为泛型既允许设定通配符的上限,也允许设定通配符的下限,所以允许在一个类里包含如下两个方法定义:
public class MyUtils{ public static <T> void copy(Collection<T> dest, Collection<? extends T> src){ } public static <T> T copy(Collection<? super T> dest, Collection<T> src) { } }上面MyUtils类中包含两个copy()方法,但调用这个方法就会引起编译错误:
List<Number> ln = new ArrayList<>(); List<Integer> li = new ArrayList<>(); copy(ln, li);编译器无法确定这行代码想要调用哪个copy()方法。
泛型与数组:
参考网址:
posted @请注意,本站信息均收集自互联网,相关信息仅供参考,医疗等重要信息请以正规途径为最终意见,本站不承担任何责任!