1. 泛型在继承上的使用
- 类 SuperA 是类A的父类,则 G<SuperA> 与 G<A>的关系:G<SuperA>和 G<A> 是并列的两个类,没有任何子父类的关系。
比如:ArrayList<0bject>、ArrayList<String>没有关系- 类 SuperA 是类A的父类或接口,SuperA<G> 与 A<G>的关系,SuperA<G>与A<G> 有继承或实现的关系。即 A<G>的实例可以赋值给 SuperA<G>类型的引用(或变量)
比如: List<String>与 ArrayList<String>
2. 通配符:?
2.1 使用说明:
举例:ArrayList<?>
G<?>可以看做是G<A>类型的父类,即可以将G<A>的对象赋值给G<?>类型的引用(或变量)
2.3 读写数据的特点
读取数据:允许。读取的值的类型为Object类型
写入数据:不允许。特例:写入null值。
List<?> list = null;
List<String> list1 = new ArrayList<String>();
list1.add("abc");
list = list1;
//可以读数据
Object obj = list.get(0);
System.out.println(obj);
//不可以写数据
// list.add("BB");
//可以写NULL
list.add(NULL);
2.4 有限制条件的通配符
List<? extends A> :可以将List<A>或List<B>赋值给List<? extends A>其中B类是A类的子类。(小于等于)
List<? super A> :可以将List<A>或List<B>赋值给List<? extends A>其中B类是A类的父类。(大于等于)
List<? extends Father> list = null;
List<Object> list1 = nulll;
List<Father> list2 = nulll;
List<Son> list3 = nulll;
//list = list1; 不可以这样
list = list1;
list = list2;
list = list3;
List<? super Father> list = null;
List<Object> list1 = nulll;
List<Father> list2 = nulll;
List<Son> list3 = nulll;
//list = list3; 不可以这样
list = list1;
list = list2;
list = list3;