• java 面向对象(三十六):泛型五 通配符


    1.通配符的使用

    /*
        通配符的使用
           通配符:?
    
           类A是类B的父类,G<A>和G<B>是没关系的,二者共同的父类是:G<?>
    
    
         */
    
        @Test
        public void test3(){
            List<Object> list1 = null;
            List<String> list2 = null;
    
            List<?> list = null;
    
            list = list1;
            list = list2;
            //编译通过
    //        print(list1);
    //        print(list2);
    
    
            //
            List<String> list3 = new ArrayList<>();
            list3.add("AA");
            list3.add("BB");
            list3.add("CC");
            list = list3;
            //添加(写入):对于List<?>就不能向其内部添加数据。
            //除了添加null之外。
    //        list.add("DD");
    //        list.add('?');
    
            list.add(null);
    
            //获取(读取):允许读取数据,读取的数据类型为Object。
            Object o = list.get(0);
            System.out.println(o);
    
    
        }
    
        public void print(List<?> list){
            Iterator<?> iterator = list.iterator();
            while(iterator.hasNext()){
                Object obj = iterator.next();
                System.out.println(obj);
            }
        }

    2.涉及通配符的集合的数据的写入和读取:

    见上

    3.有限制条件的通配符的使用

    /*
        限制条件的通配符的使用。
            ? extends A:
                    G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类
    
            ? super A:
                    G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类
    
         */
        @Test
        public void test4(){
    
            List<? extends Person> list1 = null;
            List<? super Person> list2 = null;
    
            List<Student> list3 = new ArrayList<Student>();
            List<Person> list4 = new ArrayList<Person>();
            List<Object> list5 = new ArrayList<Object>();
    
            list1 = list3;
            list1 = list4;
    //        list1 = list5;
    
    //        list2 = list3;
            list2 = list4;
            list2 = list5;
    
            //读取数据:
            list1 = list3;
            Person p = list1.get(0);
            //编译不通过
            //Student s = list1.get(0);
    
            list2 = list4;
            Object obj = list2.get(0);
            ////编译不通过
    //        Person obj = list2.get(0);
    
            //写入数据:
            //编译不通过
    //        list1.add(new Student());
    
            //编译通过
            list2.add(new Person());
            list2.add(new Student());
    
        }     
  • 相关阅读:
    Android-自定义meta-data扩展数据
    (转载)【Android】ViewGroup全面分析
    小问题记录
    Gson使用 .Net中的日期序列化成带字母T的格式,Gson发序列化问题
    Android中自定义textview可以进行自体设置
    .Net版的BeanUtils
    Ksoap2-android 添加网络超时的实现
    Html5 viewport 解释
    计算两个日期之间相差的月数
    Android中的Adapter内,有getView方法
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13184543.html
Copyright © 2020-2023  润新知