JAVA 通配符的概念

2020-03-27  本文已影响0人  雨灬慢下
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

以上面的继承关系说明

public static void main(String[] args) {
        //ArrayList<Animal>不是ArrayList<Dog>的父类或同类,否则导致一个Cat对象能添加到Dog集合中
        //所以需要泛型的存在
//        ArrayList<Dog> list = new ArrayList<Dog>();
//        list.add(new Dog());
//        ArrayList<Animal> temp = list;
//        temp.add(new Cat());

        //上界通配符,能接收同类或子类,能取不能设置修改
        ArrayList<Dog> list = new ArrayList<Dog>();
        ArrayList<? extends Animal> temp = list;
        ArrayList<? extends Dog> temp1 = list;
//        temp.add(new Dog());        //Error
//        temp.add(new Animal());    //Error
//        temp.add(new Cat());         //Error
        Animal animal = temp.get(0);

        //下届通配符,能接收父类或同类
        ArrayList<Animal> list2 = new ArrayList<Animal>();
        ArrayList<? super Animal> temp2 = list2;
        ArrayList<? super Dog> temp3 = list2;

        temp2.add(new Animal());
        temp2.add(new Dog());
        temp2.add(new Cat());
//        Animal object = temp2.get(0);   //Error
        Object o = temp3.get(0);
    }
总结:
通配符解决的是泛型与泛型之间赋值指向的问题,例如ArrayList<Animal> 与 ArrayList<Dog>
正常情况的set和get
    set:能够插入设置泛型同类和子类,存在多态
        ArrayList<Animal> list2 = new ArrayList<Animal>();
        list2.add(new Dog());
    get:拿到索引指定对象,存在多态
        ArrayList<Dog> list = new ArrayList<Dog>();
        Animal a= list.get(0);
上界通配符extends:赋值后,接收同类或子类,实际对象从子类变成了父类,内部元素能get不能set,因为多态存在
    set:ArrayList<Dog>-->ArrayList<Animal>-->list.add(new Cat())-->等于将一个cat对象插入ArrayList<Dog>中,这是不被允许的
    get:ArrayList<Dog>-->ArrayList<Animal>-->Animal a= list.get(0)-->Animal指向一个Dog对象,没问题
下界通配符super:赋值后,接收同类或父类,实际对象从父类变成了子类,内部元素能set不能get,因为多态存在
    set:ArrayList<Animal>-->ArrayList<Dog>-->list.add(new Dog())-->等于将一个Dog对象添加到一个Animal集合,没问题
    get:ArrayList<Animal>--->ArrayList<Dog>-->Dog dog = list.get(0);-->等于用子类dog指向一个父类对象,这是不被允许的.除非像上面一样用顶级父类Object来接收,这里不能用Animal来接收,因为它不是Dog的顶级父类,存在Dog extends Animal,Animal extends Life,此时ArrayList<Life>--->ArrayList<Dog>,用Animal来指向父类Life对象显然也是不被允许的
上一篇下一篇

猜你喜欢

热点阅读