1. 程式人生 > 其它 >泛型 --- 萬用字元和有條件萬用字元的使用

泛型 --- 萬用字元和有條件萬用字元的使用

技術標籤:java高階java

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());