泛型 --- 通配符和有条件通配符的使用

1. 通配符的使用

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

     	List<Object> list1=null;
        List<String> list2=null;
        List<?> list=null;
        list=list1;
        list=list2;
        
        dayin(list1);
        dayin(list2)
    }
    
    public  static  void dayin(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }
    
  • 对于List<?>就无法向其内部添加数据,除了添加null之外

    List<String> list3=new ArrayList<>();
    list3.add("AA");
    list3.add("bb");
    list3.add("cc");
    list=list3;
    //添加
    list.add("dd");
    
  • 允许读取数据,读取的数据类型为Object

    //读取
    Object o = list.get(0);
    System.out.println(o);
    


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

  • G<? extends A>:

    可以作为G和G的子类,其中B是A的子类

  • G<? Super A>:

    可以作为G和G的父类,其中B是A的父类

    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;
    
  • extends相当于≤,super相当于≥

    List<? extends Person>list1=null;
    List<? super Person>list2=null;
    
    List<Student> list3=null;
    List<Person> list4=null;
    List<Object> list5=null;
    
    //读取数据
    list1=list3;
    Person person = list1.get(0);
    
    list2=list4;
    Object object = list2.get(0);
    
    
    
    //写入数据
    //list1.add(new Person()); //编译不通过
    
    //可以编译
    list2.add(new Person());
    list2.add(new Student());
    
上一篇:reactor简介


下一篇:【花落&月缺】数组分组