zoukankan      html  css  js  c++  java
  • 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());
    
        }     
  • 相关阅读:
    自动从vss下载代码并编译的脚本
    自动执行Sql脚本的批处理
    编译 SharpDevelop2.2源码 经过
    .net框架源代码批量下载器使用方法
    sql server 解决孤立用户问题
    元数据学习分享
    SQL注入攻击的原理及其防范措施(转)
    .Net Remoting和Web Service浅析(转)
    usercontrol 和 page 的继承
    如何提高页面现实速度
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13184543.html
Copyright © 2011-2022 走看看