【Java笔记】泛型通配符<?>的使用

本文详细介绍了Java中泛型通配符的使用,包括无限制的通配符、读取与写入操作的限制以及有限制条件的通配符(如? extends A和? super A)。通过示例代码,阐述了如何在不同情况下正确地使用通配符,以实现更灵活的类型转换和操作。
摘要由CSDN通过智能技术生成

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

目录

通配符的使用

使用通配符后数据的读取和写入

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


通配符的使用

如果类 A 是类 B 的父类,G <A> 和 G <B> 是没有关系的,二者共同的父类是:G <?>

import org.junit.Test;
import java.util.Iterator;
import java.util.List;

public class TongPeiFuTest {
    @Test
    public void test(){
        List<Object> list1 = null;
        List<String> list2 = null;
        List<?> list = null;
        list = list1;
        list = list2;
    }
    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }
}

使用通配符后数据的读取和写入

添加或写入:对于 List <?> 就不能再向其内部添加数据,除了添加 null 之外

获取或读取:允许读取数据,读取的数据类型是 Object

import org.junit.Test;
import java.util.ArrayList;
import java.util.List;

public class TongPeiFuTest {
    @Test
    public void test(){
        List<String> list = new ArrayList<>();
        list.add("AA");
        list.add("BB");
        list.add("CC");
        List<?> list1 = new ArrayList<>();
        list1 = list;
        //写入
        list1.add(null);
        //读取
        Object o = list.get(0);
        System.out.println(o);
    }
}

>>> AA

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

? extends A :

        G<? extends A> 可以作为 G <A> 和 G <B> 的父类,其中 B 是 A 的子类

? super A :

        G<? super A> 可以作为 G <A> 和 G <B> 的父类,其中 B 是 A 的父类

//假设我们定义了 Person 类,Student 类继承 Person 类,以下注释的情况编译不通过
import org.junit.Test;
import java.util.List;

public class TongPeiFuTest {
    @Test
    public void test() {
        List<? extends Person> list1 = null;
        List<? super Person> list2 = null;
        List<Student> list3 = null;
        List<Person> list4 = null;
        List<Object> list5 = null;
        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);
        list2.add(new Person());
        list2.add(new Student());    
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java小白。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值