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