Java 泛型中的 PECS 原则

PECS 即 producer extends, Consumer super

    如果想要获取, 那么推荐使用 ? extends T 如果想要存放, 那么推荐使用 ? super T
@Test
    public void testPecs() {
          
   
        // 使用 ? extends Number 表示元素的上限是 Number
        // 我们无法确定具体是哪种类型的元素可以存入
        // 可以确定是取出的元素类型是兼容 Number 类型的
        List<? extends Number> list = new ArrayList<>();
        // 编译报错
        // list.add(123);
        // list.add(new Object());
        list.add(null);
        // 只能 get, get 的对象一定是 Number 或者 Number 的子类, 那么使用 Number 是类型兼容的, 所以编译不报错
        Number number = list.get(0);

        // 使用 ? super Number 表示元素的下限是 Number
        // 我们不能确定取出元素的类型是 Number 或 Number 的哪个父类
        // 我们可以确定的是存入的元素类型是兼容 Number 或者 Number 的子类
        List<? super Number> list2 = new ArrayList<>();
        // Number 或者 Number 的父类无法确定具体是哪个
        // 添加元素时加入 Number 的子类, 一定是类型兼容的, 所以编译不报错
        list2.add(100);
        list2.add(100L);
        list2.add(100.0d);
        // 取出元素数据类型是 Object 类, 即所有对象的父类
        Object object = list2.get(0);
    }
经验分享 程序员 微信小程序 职场和发展