类型通配符:?使用说明有限制的通配符 类型通配符:?比如:List<?> ,Map<?,?> List<?>是List、List等各种泛型List的父类。 使用说明 读取List<?>的对象list中的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object。写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中添加对象。 唯一的例外是null,它是所有类型的成员。 public static void main(String[] args) { List<?> list = null; list = new ArrayList<String>(); list = new ArrayList<Double>();// list.add(3);//编译不通过 list.add(null); List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); l1.add("hello"); l2.add(15); 7+ read(l1); read(l2); } public static void read(List<?> list) { for (Object o : list) { System.out.println(o); } } //注意点1:编译错误:不能用在泛型方法声明上,返回值类型前面<>不能使用?public static <?> void test(ArrayList<?> list){}//注意点2:编译错误:不能用在泛型类的声明上class GenericTypeClass<?>{}//注意点3:编译错误:不能用在创建对象上,右边属于创建集合对象ArrayList<?> list2 = new ArrayList<?>(); 有限制的通配符 <?> 允许所有泛型的引用调用 通配符指定上限 上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<= < ? extends Number>只允许泛型为Number及Number子类的引用调用 通配符指定下限 下限super:使用时指定的类型不能小于操作的类,即>= < ? super Number> 只允许泛型为Number及Number父类的引用调用 public void test4(){ List<? extends Person> list1 = null; List<? super Person> list2 = null; List<Student> list3 = new ArrayList<Student>(); List<Person> list4 = new ArrayList<Person>(); List<Object> list5 = new ArrayList<Object>(); list1 = list3; list1 = list4;// list1 = list5;// list2 = list3; list2 = list4; list2 = list5; //读取数据: list1 = list3; Person p = list1.get(0); //编译不通过 //Student s = list1.get(0); list2 = list4; Object obj = list2.get(0); ////编译不通过// Person obj = list2.get(0); //写入数据: //编译不通过// list1.add(new Student()); //编译通过 list2.add(new Person()); list2.add(new Student()); }