java泛型通配符如何使用
1、为了可以更好的演示案例效果,需要创建Person和Student两个类文件,Student继承Person类,并且使用idea开发工具生成对应的get和set以及toString方法
2、Person[] persons = new Person[10]挢旗扦渌;Person[] persons1 = new Student[10];编译通过,说明Student[]可以协变到Person[]List<Person> personList = new ArrayList<Person>();List<Person> personList1 = new ArrayList<Student>();//error第二个编译错误,说明List<Person>和List<Student>是两个不同的类型
3、为了解决这个问题,可以使用?通配符的方式,单独使用是无边界通配符,如图所示,首先传入List<Person>,编译和运行都没有问题
4、在传入List<Student>类型,同样编译和运行都没有问题,说明print(List<?> list)可以传List<Person>和List<Student>两种类型,但print中不能对list进行编辑操作,只能读,尝试使用add方法编译错误
5、固定上边界通配符,<? extends E>,如图所示,List<? extends Person>,只要是Person对象以及子类对象都可以传递进去,print方法内部可以直接作为Person对象类使用,但只能读,不能对list进行add操作
6、运行之后查看打印结果,说明结果和预料的一样
7、固定下边界通配符,<? superE>,如图所示,List<? super Student> list,只要是Student对象以及其父类对象类型的list都可以传递进去,这种方式不同于前面两种,使用下边界通配符可以对list进行add操作了,但不能get出具体的类型,只能是Object类型