Java 泛型有两个特点:1、标记 2、继承链
1、标记:子类 Son 继承 父类Father
List<Father> fatherList = new ArrayList<>();
List<Son> sonList = fatherList ; // 不可赋值
List<Son> sonList = new ArrayList<>();
List<Father> fatherList = sonList ; // 不可赋值
2、类 GrandFather 、Father 、Son 依次存在继承关系
List<? extends Father> list = new ArrayList();
List<Son> sonList = new ArrayList<>();
// list 、 sonList 均可以作为方法参数传入,说明 Father 类及其子类的泛型均可传入
void get(List<? extends Father> list ) // 只能遍历,不能新增
List<? super Father> list = new ArrayList();
List<GrandFather> grandFatherList = new ArrayList<>();
// list 、 grandFatherList 均可以作为方法参数传入,说明 Father 类及其父类的泛型均可传入
// list 添加类型只能添加 list 及其子类,属于容器级别的添加,无关于泛型标记
void add(List<? super Father> list )
注意:List<? extends Father> 只能 get,不能 add
List<? super Father> 只能 add,不能 get
二者都主要用于获取第三方 API