zoukankan      html  css  js  c++  java
  • 泛型在继承上的体现、通配符

    package com.atguigu.java;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /** 如何自定义泛型结构:泛型类、泛型接口;泛型方法。
     *
     * 1. 关于自定义泛型类、泛型接口:
     *
     *
     *
     * @author CH
     * @create 2021 上午 11:09
     */
    public class GenericTest1 {
    
        @Test
        public void test1(){
            //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
        //要求:如果大家定义了类是带泛型的,建议在实例化时要指明类的泛型。
            Order order = new Order();
            order.setOrderT(123);
            order.setOrderT("ABC");
    
            //建议:实例化时指明类的泛型
            Order<String> order1 = new Order<String>("orderAA",1001,"order:AA");
    
            order1.setOrderT("AA:hello");
    
        }
    
        @Test
        public void test2(){
            SubOrder sub1 = new SubOrder();
            //由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
            sub1.setOrderT(1122);
    
            SubOrder1<String> sub2 = new SubOrder1<>();
            sub2.setOrderT("order2...");
        }
    
        @Test
        public void test3(){
    
            ArrayList<String> list1 = null;
            ArrayList<Integer> list2 = new ArrayList<Integer>();
            //泛型不同的引用不能相互赋值。
    //        list1 = list2;
    
            Person p1 = null;
            Person p2 = null;
            p1 = p2;
    
    
        }
    
        //测试泛型方法
        @Test
        public void test4(){
            Order<String> order = new Order<>();
            Integer[] arr = new Integer[]{1,2,3,4};
            //泛型方法在调用时,指明泛型参数的类型。
            List<Integer> list = order.copyFromArrayToList(arr);
    
            System.out.println(list);
        }
    }

    泛型在继承上的体现:

    1. 泛型在继承方面的体现

    虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系。

    补充:类A是类B的父类,A<G> 是 B<G> 的父类

    /*
        1. 泛型在继承方面的体现
    
          虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系。
    
           补充:类A是类B的父类,A<G> 是 B<G> 的父类
    */
        @Test
        public void test1(){
    
            Object obj = null;
            String str = null;
            obj = str;
    
            Object[] arr1 = null;
            String[] arr2 = null;
            arr1 = arr2;
            //编译不通过
    //        Date date = new Date();
    //        str = date;
            List<Object> list1 = null;
            List<String> list2 = new ArrayList<String>();
            //此时的list1和list2的类型不具有子父类关系
            //编译不通过
    //        list1 = list2;
            /*
            反证法:
            假设list1 = list2;
               list1.add(123);导致混入非String的数据。出错。
             */
    
            show(list1);
            show1(list2);
    
        }
    @Test
    public void test2(){

    AbstractList<String> list1 = null;
    List<String> list2 = null;
    ArrayList<String> list3 = null;

    list1 = list3;
    list2 = list3;

    List<String> list4 = new ArrayList<>();

    }
     
    /*
        2. 通配符的使用
           通配符:?
           类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);
            }
        }
    
        /*
        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());
    
        }

     

    通配符的使用

     

     通配符的使用:有限制的通配符

    不积跬步,无以至千里;不积小流,无以成江海。
  • 相关阅读:
    【数学】【AOJ-614】座位安排
    【乱搞】【AOJ-611】消失的5,8,9
    redis 与session
    Nginx 与 tomcat 部署网站
    linux 进程在后台执行
    印象笔记
    consul 小結
    spring boot 使用拦截器,注解 实现 权限过滤
    Springcloud/Springboot项目绑定域名,使用Nginx配置Https
    spring boot 登录认证
  • 原文地址:https://www.cnblogs.com/CCTVCHCH/p/14854602.html
Copyright © 2011-2022 走看看