• java 基础(泛型 通配符)


    <?>

    允许所有泛型的引用调用

    通配符指定上限

    上限 extends: 使用时指定的类型必须是继承某个类,或者实现某个接口,即<=

    通配符指定下限

    下限 super: 使用时指定的类型不能小于操作的类,即 >=

    Person.java

    package com.klvchen.java2;
    
    public class Person {
    }
    

    Student.java

    package com.klvchen.java2;
    
    public class Student extends Person{
    }
    

    GenericTest.java

    package com.klvchen.java2;
    
    import org.junit.Test;
    
    import java.util.AbstractList;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class GenericTest {
        /*
        1. 泛型在继承方面的体现
    
        类A是类B的父类,G<A>和G<B>二者不具备子父类关系,二者是并列关系。
    
         */
    
        @Test
        public void test1(){
            Object obj = null;
            String str = null;
            obj = str;
    
            Object[] arr1 = null;
            String[] arr2 = null;
            arr1 = arr2;
    
            List<Object> list1 = null;
            List<String> list2 = null;
    
            // 此时的 list1 和 list2 的类型不具有子父类关系
            // 编译不通过
            //list1 = list2;
    
            show(list1);
            show1((list2));
        }
    
        public void show1(List<String> list) {
    
        }
    
        public void show(List<Object> list) {
    
        }
    
        @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(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<? extends 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());
    
        }
    }
    
    
  • 相关阅读:
    Mysql有什么办法批量去掉某个字段字符中的空格
    Mysql order by 排序 varchar 类型数据
    JS将人民币小写金额转换为大写
    禁止表单输入中文(禁止粘贴)
    abp vnext 开发快速入门 3 实现权限控制
    abp vnext 开发快速入门 2 实现基本增删改查
    abp vnext 开发快速入门 1 认识框架
    从零开始一起学Blazor WebAssembly 开发(4)
    发布一个自己做的图片转Base64的软件,Markdown写文章时能用到
    一起学Blazor WebAssembly 开发(3)
  • 原文地址:https://www.cnblogs.com/klvchen/p/15413708.html
Copyright © 2020-2023  润新知