美文网首页
JAVA 通配符的概念

JAVA 通配符的概念

作者: 雨灬慢下 | 来源:发表于2020-03-27 13:18 被阅读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对象显然也是不被允许的

    相关文章

      网友评论

          本文标题:JAVA 通配符的概念

          本文链接:https://www.haomeiwen.com/subject/mgdluhtx.html