秋招之路4:泛型中的<? extends E>和<? super E>
<? extends E>
- ? 是继承于E的,用来限制元素的类型上限,?是E的子类或E
- 赋值:只能是E的子类给父类赋值。
- 写入:因为惧怕类型污染,只能写入null(null属于全类型)。
- 读取:咋读都可以
<? super E>
- ? 超类于E,用来限制元素的类型下限,?是E的父类或E
- 赋值:只能是E的父类给子类赋值
- 写入:可以添加E,E的子类,但是不能添加E的父类
原因:E的子类都可以向上转换为某一个?,
但是E的父类有很多,避免类型污染,不能随意添加。
- 读取:必须进行强制类型转换
PECS原则
当需要频繁取值,而不需要写值则使用" ? extends T "作为数据结构泛型。
相反,当需要频繁写值,而不需要取值则使用" ? super T "作为数据结构泛型。
又要频繁写又要频繁读,就别用泛型通配符。