1 若类A是类B的子类,那么List<A>就不是List<B>的子接口
2 通配符:List[A],List[B]...都是List<?>的子类
extends A:可以存放A及其子类
super A:可以存放A及其父类
@Test //泛型与继承 public void test4(){ List<?> list = null; List<Object> list1 = null; List<Character>list2 = new ArrayList<Character>(); //list1 = list2; 错误 list = list1; list = list2; getList(list1); getList(list2); List<? extends Number> a1 = null; List<Integer> a2 = null; a1 = a2; List<Object> a3 = null; List<? super Number> a4 = null; a4 = a3; } public void getList(List<?> list){ }
3 可以读取声明为通配符的集合类的对象,但不允许向声明为通配符的集合类中写入对象,唯一例外的是null。
@Test public void test5(){ List<String> list1 = new ArrayList<String>(); list1.add("ff"); list1.add("vb"); List<?> list2 = null; list2 = list1; //可以读取声明为通配符的集合类的对象 Iterator<?> ite = list2.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); //返回Object类型 } //但不允许向声明为通配符的集合类中写入对象,唯一例外的是null //list2.add("sfd"); ---------错的 list2.add(null); }