List集合中泛型使用细节

Posted 暴躁的程序猿啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List集合中泛型使用细节相关的知识,希望对你有一定的参考价值。

list泛型类型

我们来看一段代码

 public void test(){
        Object o=null;
        String str1=null;
        //多态表现   父类的引用接收子类的对象
        o=str1;
    }

但是下面这样的代码是不能赋值的

 public void test(){
        List<Object> list1=null;
        List<String> list2=null;
        //此时list1和list2不具有子父类关系
        list1=list2;
    }



我们可以看到 需要的是Object 传的是一个String
这种情况我们使用时候是需要注意的
但是有一种情况是可以的

 //但是这种情况是可以的  泛型相同 多态的表现
        List<String> list3=null;
        ArrayList<String> list4=null;
        list3=list4;
        //相当于 这样
        List<String> list5=new ArrayList<String>();

这样是可以的相当于 多态的表现

List泛型使用通配符 ?

我们使用?通配符的时候 这样赋值可以

  public void List1() {
        List<String> list1 = new ArrayList<>();
        List<?> list=new ArrayList<>();
        list1.add("111");
        //这样赋值是可以的
        list=list1;
    }

但是我们使用add、get方法时

  public void List1() {
        List<String> list1 = new ArrayList<>();
        List<?> list=new ArrayList<>();
        list1.add("111");
        //这样赋值是可以的
        list=list1;
        //对于List<?>就不能向其内部添加数据
        //但是不可以添加数据  除了添加  null
        list.add("1");
        //可以读取数据
        list.get(0);
    }

可以看到是有错误的 不能添加数据

但是有一个特例 添加null是可以添加的

 public void List1() {
        List<String> list1 = new ArrayList<>();
        List<?> list=new ArrayList<>();
        list1.add("111");
        //这样赋值是可以的
        list=list1;
        //对于List<?>就不能向其内部添加数据
        //但是不可以添加数据  除了添加  null
        list.add("1");
        //null可以
        list.add(null);
        //可以读取数据
        list.get(0);
    }

List泛型使用 有限制条件的通配符的使用

? extents Person ? super Person

创建两个类演示

/**
 * @create: 2021/10/2
 * @author: Tony Stark
 */
public class Person {
}
/**
 * @create: 2021/10/2
 * @author: Tony Stark
 */
public class Student extends Person {

}

我们创建集合使用泛型赋值测试

   public void Extent() {
        //必须赋值小于等于的类型
        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;
    }

可以看到报错了

这里就要介绍一下范围的要求
? extents Person
必须赋值小于等于person的类型
? super Person
必须赋值大于等于person的类型

很明显我们上面list5是object类型大于了我们的list1要求小于等于persion
同理 list3是student不满足list2大于等于person的要求

以上是关于List集合中泛型使用细节的主要内容,如果未能解决你的问题,请参考以下文章

java中泛型的使用

如何反射获取List<T> 中泛型的类型

java中泛型List问题

java中啥叫泛型??

Java中泛型与集合

当List的size为0时,如何获取List中泛型的类型