Java泛型
泛型介绍:
E – Element (在集合中使用,因为集合中存放的是元素)
T – Type(Java 类)
K – Key(键)
V – Value(值)
N – Number(数值类型)
? – 表示不确定的java类型(无限制通配符类型)
Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。
<? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
<? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object
PECS原则
如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)
如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)
如果既要存又要取,那么就不要使用任何通配符。
一个神奇的现象:

前提:该方法是在main方法里写的,添加的元素也符合泛型的限制要求;
问题:list为什么不能进行add操作呢?
如果List<? extends Season>支持add方法的方法合法的话
list1可以add Season和所有Season的子类
list2可以add Spring和所有Spring的子类
list3可以add Summer和所有Summer的子类
问题就出在这里:
List<? extends Season>所应该持有的对象是Season的子类,而且具体是哪一个子类还是个未知数,所以加入任何Season的子类都会有问题;
但是,这种形式还是很有用的,虽然不能使用add方法,但是可以在初始化的时候一个Season指定不同的类型。比如:


super
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。

List<? super Spring> seasons不可以直接add操作,正确操作如上;
推荐阅读相关文章: https://www.bbsmax.com/A/Gkz1n7lQJR/ https://blog.csdn.net/feicongcong/article/details/53981861

浙公网安备 33010602011771号