JAVA---->通配符的使用

本文深入探讨了Java中的泛型通配符用法,包括无限制通配符、上边界限定通配符和下边界限定通配符。通过示例展示了它们在读写操作中的限制,以及在不同场景下的适用性。通配符的使用能提高代码的灵活性和安全性,但同时也需要谨慎处理写入操作以避免类型安全问题。

通配符用法

 1. 在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义

 2. <? extends Object>代表上边界限定通配符

 3. <? super Object>代表下边界限定通配符。

上边界限定通配符

上边界通配符直接使用add()方法受限,但是可以用来获取各种数据类型的数据,并赋值给父类型的引用。

List<? extends Number> list=null;
list=new ArrayList<Integer>();
list.add(new Integer(1));//报错,因为list不能确定实例化的对象具体类型导致add()方法受限
...
list.get(0);//正确

1 关于通配符和写入操作

/*
    通配符的使用:?

    1. G<?> 可以看做是G<A>的父类,可以体现多态性。其中A是任何一个类。

    2. 向声明为通配符的集合中,写入数据: 不被允许的。
        但是,唯一可以写入的值:null

     */
    @Test
    public void test1(){
        ArrayList<Object> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        method(list1);
        method(list2);
    }

    public void method(ArrayList<?> list) {

//        list.add(123);
//        list.add("AA");
        //唯一可以写入的值:null
        list.add(null);
    }

2 读取操作

 /*
    3. 向声明为通配符的集合中,读取数据:允许的。
     */
    @Test
    public void test2(){
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("AA");
        list2.add("BB");

        method1(list2);
    }
    public void method1(ArrayList<?> list) {
        Iterator<?> iterator = list.iterator();
        while(iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }

3 有限制条件的通配符

/*
    有限制条件的通配符的使用
     */
    @Test
    public void test3(){
        List<Object> list1 = null;
        List<Person> list2 = null;
        List<Student> list3 = null;
        //情况1:
        List<?> list4 = null;
        list4 = list1;
        list4 = list2;
        list4 = list3;

        //对于list4来说,只能写入null,其他值不能写入。  支持数据的读取。

        //情况2:可以接收Person类及Person类的子类的泛型类型
        List<? extends Person> list5 = null;
//        list5 = list1;//错误
        list5 = list2;
        list5 = list3;

        //情况3:可以接收Person类及Person类的父类的泛型类型
        List<? super Person> list6 = null;
        list6 = list1;
        list6 = list2;
//        list6 = list3;//错误
    }

    @Test
    public void test4(){
        List<Student> list = new ArrayList<>();
        list.add(new Student());
        List<? extends Person> list5 = list;
        //写入数据:只能写入null,其他值不可以。
        list5.add(null);
//        list5.add(new Student());
        //读取数据:可以读取,读取的数据类型为Person
        Person person = list5.get(0);
    }

    @Test
    public void test5(){
        List<Object> list = new ArrayList<>();
        list.add(new Object());
        List<? super Person> list5 = list;
        //写入数据:可以写入Person及Person子类对象
        list5.add(null);
        list5.add(new Student());
        list5.add(new Person());
//        list5.add(new Object());//错误的
        //读取数据:读取的数据类型为Object
        Object obj = list5.get(0);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值