【java】泛型中,? extends T 与 ? super T 的区别、看法

1. List和List有哪些区别?


①List ,只允许泛型为T及T的子类引用调用。比如:

List list = new ArrayList;

List,只允许泛型为T及T的父类引用调用。比如:

List< ? super Integer> list = new ArrayList;


②List,可以获取,不可以插入,比如说,

List list = null;
list = new ArrayList();
Number num1 = list.get(1);//√,取Number对象,赋给Number类型,当然符合Java规范
Integer num2 = list.get(1);//×,取Number对象,想赋给Integer类型,由于可能是Double类型、Float类型等等,自然就不符合Java规范
list.add(new Integer(1));//×,new一个Integer对象,因为声明写着List,不能确定实例化对象的具体类型,所以不能进行插入。

    List,则相反,可以插入,不可以获取,(因为Number是Integer的父类型,所以List是List的子类型),比如说,

List list = null;
list = new ArrayList();
Number num1 = list.get(1);//×,子类对象的引用无法赋值给兄弟类的引用
Integer num2 = list.get(1);//×,父类对象的引用无法赋值给子类的引用
list.add(new Integer(1));//√,子类对象的引用可以赋值给父类对象的引用


2. 类名存在哪些实际应用场景?


①PECS原则,由于的只能取,不能存,而得只能存,不能取,因此就有producer用,consumer用
②看底层源码,java.util.Collections.copy(List dest, List src)也有应用。

    public static  void copy(List dest, List src) {
        int srcSize = src.size();
        if (srcSize > dest.size())
            throw new IndexOutOfBoundsException("Source does not fit in dest");

        if (srcSize < COPY_THRESHOLD ||
            (src instanceof RandomAccess && dest instanceof RandomAccess)) {
            for (int i=0; i di=dest.listIterator();
            ListIterator si=src.listIterator();
            for (int i=0; i

 

你可能感兴趣的:(Java)