Java generics <? extends E><? super E>

background

I encountered a problem before. It failed when assigning the List of the subclass to the Lis of the parent. I checked the reason at that time and there was no record. Now I will sort it out.

<? extends E>

Upper limit wildcard, used to limit the upper limit of the element type

<? super E >

Lower limit wildcard, used to limit the lower limit of the element

Code example

public class Demo {

    public static void main(String[] args) {

        // Person 是 Girl 父类, 但是 List<Person> 不是 List<Girl> 父类
        Person person = new Girl();
        List<Person> personList = new ArrayList<>();
        List<Girl> girlList = new ArrayList<>();
        personList = girlList; // 编译报错, List<Person> 不是 List<Girl> 父类
        // 读
        Person person1 = personList.get(0);
        Girl girl1 = personList.get(0); // 编译报错, 父类无法赋值给子类
        // 写
        personList.add(new Girl());
        personList.add(new Person());


        // 上限通配符, 标记是Person或其子类
        List<? extends Person> peopleListExtends = new ArrayList<>();
        peopleListExtends = personList;
        peopleListExtends = girlList;
        // 读
        Person personExtends = peopleListExtends.get(0);
        Girl girlExtends = peopleListExtends.get(0); // 编译报错, 因为可能是Person对象, 无法赋值给子类
        // 写
        peopleListExtends.add(new Person()); // 编译报错, 上限是Person, 但子类可能是多个, 无法确定具体类型
        peopleListExtends.add(new Girl()); // 编译报错, 上限是Person, 但子类可能是多个, 无法确定具体类型


        // 下限通配符, 标记其是Girl或其父类
        List<? super Girl> peopleListSuper = new ArrayList<>();
        peopleListSuper = personList;
        peopleListSuper = girlList;
        // 读
        Girl girl2 = peopleListSuper.get(0); // 编译报错, 下限是Girl, 但可能是父类, 无法确定具体类型
        Person person2 = peopleListSuper.get(0); // 编译报错, 下限是Girl, 但可能是父类, 无法确定具体类型
        // 写
        peopleListSuper.add(new Girl());
        peopleListSuper.add(new Person()); // 编译报错, 下限是Girl, 父类无法转化为子类

    }
}

class Person {

}

class Girl extends Person {

}

class Boy extends Person {

}

 

Borrow

The <? in Java generics extends E><? super E>

Guess you like

Origin blog.csdn.net/yxz8102/article/details/88395758