赞
踩
一定要看代码部分
java开发手册
一、编程规范
(六)集合处理
12. 【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,
两者在接口调用赋值的场景中容易出错。 说明:扩展说一下PECS(Producer Extends Consumer Super)原则:
第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>
原文
- 【强制泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super
T>不能使用get方法,两者在接口调用赋值的场景中容易出错。 说明:扩展说一下PECS(Producer Extends Consumer
Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>
package com.wsq.io.nio; import java.util.ArrayList; import java.util.List; /** * java开发手册 * 一、编程规范 * (六)集合处理 * 12. 【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法, * 两者在接口调用赋值的场景中容易出错。 说明:扩展说一下PECS(Producer Extends Consumer Super)原则: * 第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T> * * @author midouwan * @date 2021-01-18 9:17 上午 */ public class Test { public static void main(String[] args) { //最小子类 Student student = new Student(); // 多态体现 List<Animal> animals = new ArrayList<>(); animals.add(student); List<Person> person = new ArrayList<>(); person.add(student); List<Student> students = new ArrayList<>(); students.add(student); //List<?> 无界通配符 //List<? extends Person> 上界通配符 ?表示Person的子类 //List<? super Person> 下界通配符 ?表示Person的父类 // 调用上界通配符接口保存信息,接口入参为 List<? extends Person>,只能传入List<Person>或者List<Student> saveExtendsList(person); saveExtendsList(students); saveExtendsList(animals);//不满足,编译器报错 // 调用下界通配符接口保存信息,接口入参为 List<? super Person>,只能传入List<Person>或者List<animals> saveSuperList(person); saveSuperList(animals); saveSuperList(students);//不满足,编译器报错 //调用别人提供的接口,获取集合信息,不清楚提供方到底返回的是哪个集合,List<Person> 还是 List<Student> ? List<? extends Person> extendList = getExtends(); //调用get会返回上边界父类对象,可以用父类方法操作子类 Person p = extendList.get(0); Student s = extendList.get(0);//不满足,编译器报错,编译器表示,老色龙后代五花八样,谁知道你是啥样的人 //下面三行全报错,按理说应该可以添加student对象,从当前类看只有animal,student,person三个类,如果还有别的呢, // 比如学生下面还有两个同级子类,高中生和小学生,别人提供的接口返回的是高中生,然后添加了小学生,编译器表示这个我懵逼,我得报错 extendList.add(new Student());//不满足,编译器报错 extendList.add(new Person());//不满足,编译器报错 extendList.add(new Animal());//不满足,编译器报错 //那有没有啥办法让编译器不懵逼呢? //如果您很确定返回的是某个类的数据,强转 List<Student> studentList = (List<Student>) getExtends(); studentList.add(new Student()); List<Person> personList = (List<Person>) getExtends(); personList.add(new Student()); List<Animal> animalList = (List<Animal>) getExtends(); animalList.add(new Student()); // 若果您看懂了上面,下面soEasy了 //调用别人接口获取数据,只知道数据是person或者person父类的集合 List<? super Person> aSuper = getSuper(); // 所以用get获取数据,编译器表示老子怎么知道是你哪个老子,压根不晓得你的老子是啥,万一是禽兽呢,我只能object呀,你自己去判断 Object object1 = aSuper.get(0); //同样如果知道是哪个,强转 Animal dd = (Animal)aSuper.get(0); // add方法,编译器表示,你的父类肯定是你儿子孙子的父类,多态支持我这么搞 aSuper.add(new Person()); aSuper.add(new Student()); } /** * 接口:保存信息 * 此处,必须传入person类或者父类集合 * @param list 下界通配符 ?表示Person的父类 */ public static void saveSuperList(List<? super Person> list) { } /** * 接口:保存信息 * 此处,必须传入person类或者子类集合 * @param list ? extends Person 上界通配符 */ public static void saveExtendsList(List<? extends Person> list) { } public static List<? super Person> getSuper() { return new ArrayList<>(); } public static List<? extends Person> getExtends() { return new ArrayList<>(); } static class Animal { } static class Person extends Animal { } static class Student extends Person { } }
转发请注明来自:https://blog.csdn.net/WANGSHUANGQUAN_A/article/details/112789960
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。