本帖最后由 x378320002 于 2013-6-13 10:32 编辑
泛型通配符是“?”,可以接受任一定义的引用参数类型,但是我们如果并不想使我么定义的方法接受所有的引用数据类型, 而是接受某一部分类型怎么办呢,此时我们就可以对泛型的进行限定,使我们定义的函数或类更加安全。
例如我们定义如下两个集合,a1和a2(此处我们设定student是person的子类) public static void main(String[] args) {
ArrayList<Person> a1 = new ArrayList<Person>();
a1.add(new Person("person1",3));
a1.add(new Person("person2",4));
ArrayList<Student> a2 = new ArrayList<Student>();
a2.add(new Student("stu1",1));
a2.add(new Student("stu2",2));
} 如果我们要定义一个方法(且不论这个方法是做什么的),既能接收a1又能接受a2,那么首先我们就会想到泛型通配符“?”, 那就就应该这么定义 public static void printCollection(Collection<?> al) {} //此方法主函数调用时即可接受a1又可a2,
但是有时我们定义的方法要实现的功能又可能是在某一个特定的对象内的功能,例如我们定义的方法要用上面集合 中person类内的特有方法getName()方法,那么此时我们就必须对这个函数接受的内容加以限定,否则就会变的 不再安全,因为这个public static void printCollection(Collection<?> al) {} 函数是什么类型内容的集合都可以接收, 如下面一个集合a3存的是字符串,它一样可以接收,但显然字符串里没有getName()方法,我们的程序会出错。 ArrayList<String> a3 = new ArrayList<String>();
a3.add("aaaa");
a3.add("bbbb"); 这里我们对函数泛型类型加以限定就派上了用场,限定只接受person类或是其子类的对象集合,因为它们才有getName() 方法,才是我们要操作的对象,可以这么限定 public static void printCollection(Collection<? extends Person> c){ } 此处的<? extends Person>即泛型的上限,只可接受person或person的子类,再往里传a3的值已经不行,编译就通不过。 还有<? super E>即泛型的下限,只可接受E或者E的父类,也是对函数的接受类型加以的限定,这就是泛型限定的来源, 以及为什么用泛型的限定。
|