List集合中泛型使用细节

2022-03-23 20:02:42 浏览数 (2)

list泛型类型

我们来看一段代码

代码语言:javascript复制
 public void test(){
        Object o=null;
        String str1=null;
        //多态表现   父类的引用接收子类的对象
        o=str1;
    }

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

代码语言:javascript复制
 public void test(){
        List<Object> list1=null;
        List<String> list2=null;
        //此时list1和list2不具有子父类关系
        list1=list2;
    }

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

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

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

List泛型使用通配符 ?

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

代码语言:javascript复制
  public void List1() {
        List<String> list1 = new ArrayList<>();
        List<?> list=new ArrayList<>();
        list1.add("111");
        //这样赋值是可以的
        list=list1;
    }

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

代码语言:javascript复制
  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是可以添加的

代码语言:javascript复制
 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

创建两个类演示

代码语言:javascript复制
/**
 * @create: 2021/10/2
 * @author: Tony Stark
 */
public class Person {
}
代码语言:javascript复制
/**
 * @create: 2021/10/2
 * @author: Tony Stark
 */
public class Student extends Person {

}

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

代码语言:javascript复制
   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的要求

0 人点赞