(黑马程序员)泛型限定原理和使用(一)
2013-06-17 08:54
302 查看
泛型通配符是“?”,可以接受任一定义的引用参数类型,但是我们如果并不想使我么定义的方法接受所有的引用数据类型,
而是接受某一部分类型怎么办呢,此时我们就可以对泛型的进行限定,使我们定义的函数或类更加安全。
例如我们定义如下两个集合,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的父类,也是对函数的接受类型加以的限定,这就是泛型限定的来源,
以及为什么用泛型的限定。
而是接受某一部分类型怎么办呢,此时我们就可以对泛型的进行限定,使我们定义的函数或类更加安全。
例如我们定义如下两个集合,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的父类,也是对函数的接受类型加以的限定,这就是泛型限定的来源,
以及为什么用泛型的限定。
相关文章推荐
- (黑马程序员)泛型的限定原理和使用(二)
- 黑马程序员--08.泛型--02.【泛型方法】【泛型接口】【泛型限定的基本使用】【个人总结】
- 黑马程序员_日记52_泛型限定初级使用
- Java基础之泛型限定的使用示例:
- Java--泛型的原理以及使用场景
- 黑马程序员---集合体系的继承关系图。顶层接口Collection中的方法,迭代器Iterator使用和原理,List派系特点
- 如何在使用了泛型限定的集合中存入其它类型的元素?
- 黑马程序员 使用通配符和使用泛型变量
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- 黑马程序员-- 高级网络编程 什么是泛型?泛型的定义?泛型如何使用?为什么要使用泛型?
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- 黑马程序员--集合框架---泛型限定
- 黑马程序员_Java基础_泛型的使用,通配符,泛型限界
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- 黑马程序员--Java基础加强--02.代码简化 书写规律I_原始数据类型【重载】【多态】【泛型】【泛型限定】【个人总结】
- 黑马程序员--Java基础加强--03.代码简化 书写规律II_参数化数据类型【重载】【多态】【泛型】【泛型限定】【个人总结】
- 黑马程序员---struts2学习笔记之八(ognl原理及使用)
- 黑马程序员——泛型限定,上限,下限
- C++ 之 高效使用STL(泛型算法设计原理解析)
- 黑马程序员_day15 TreeSet,二叉树,实现Comparator方式排序,泛型,泛型接口,泛型限定)