泛型中提供了?通配符,可以引用其他各种参数化的参数,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法
具体可以看如下代码:
public static void Convert(Collection<?> collection){
collection.add("abc");//编译时报错 通配符?无法调用参数化方法
collection.size();//可以调用因为无参
collection.equals(1);//正确
}
}
Collection<?> collection表示任意参数化类型的集合,上面collection.add("abc")错误是因为是泛型的参数是不确定的,而size()方法,equals()方法在不确定参数的情况下还可以正确调用,是因为无论泛型参数是什么类型这两个方法都是可以调用的。
相信在阅读API文档时大家经常会见到<? extends E>,<? super E>,这是什么意思呢?请先看如下代码:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<? super Integer> set1 = new TreeSet<Number>();//限定通配符的下边界,即可引用Integer类的父类对象
Set<? extends Number> set2 = new TreeSet<Integer>();//限定通配符的上边界,即可引用所有Number类的子类对象
Set<String> x = null;
Set<?> y = null;
y=x;//通配符可引用任意类型泛化参数
x=y;//
}
注意:限定通配符总是包括自己。