<? extends R> ?匹配的类型是R以及R的子类.确定了类型的上限.表示为上界通配符,不能做添加操作(可以进行初始化),用于读取操作.因为确定了上限是R读取出的所有内容均是R本身(或子级)
<? super T>
?匹配的类型是T或T的基类,确定了类型的下限.表示为下界通配符,可以进行添加操作(只能添加T类型或T的子级)因为不确定基类是哪种类型读取时只能用object接收.
1.1 概念理解
<? super T>:表示?匹配的类型都是T的父类,包括T本身。
<? extends R>:表示?匹配的类型都是类型R的子类,包括R本身。
1.2 使用List协助理解
1.2.1 List<? extends R>
List<? extends R> list:表示集合中存放的都是R的子类(包括R本身)。
针对变量List<? extends R> list。
(1)对List做添加(add(R))操作,必须使用R或者R的子类添加到list中。
(2)对List做遍历查询操作,必须使用R遍历list,取出元素.
小结:拿到一个变量使用? extends R修饰时,应该是对该变量做查询或取元素操作,不做添加操作。这种方式修饰叫做get原则。
1.2.2 List<? super T>
List<? super T> list:表示集合中存放的都是T的父类(包括T本身)。
针对变量List<? super T> list。
(1)对List做添加(add(T))操作,必须使用T或者T的子类添加到list中。
(2)对List做遍历查询操作,必须使用T父类去遍历list,取出元素。
小结:拿到一个变量使用? super T修饰时,应该是对该变量做添加操作,不做查询操作。这种方式修饰叫做put原则。