当前位置:   article > 正文

java开发手册编码规范集合第12条解释:泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法, 两者在接口调用赋值的场_泛型通配符来接收返回的数据,此写法的泛型集合不能使用add方法,而

泛型通配符来接收返回的数据,此写法的泛型集合不能使用add方法,而

一定要看代码部分
java开发手册
一、编程规范
(六)集合处理
12. 【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,
两者在接口调用赋值的场景中容易出错。 说明:扩展说一下PECS(Producer Extends Consumer Super)原则:
第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>

原文

  1. 【强制泛型通配符<? 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 {

    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127

转发请注明来自:https://blog.csdn.net/WANGSHUANGQUAN_A/article/details/112789960

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/194021
推荐阅读
相关标签