? 通配符类型
? extends T表示类型的上界:
- 表示参数化类型的可以是T或者T的子类
? super T表示类型的下界:
- 表示参数化类型是这个类型的超类型,即父类型,直至Object
? extends T
- 上界? extends T只能往外取,不能往里存
通配符 ? 和类型参数 T 的区别:
- 对于编译器来说,所有的T都代表同一种类型
- 通配符?没有这样的约束,只表示放置了一个类型,具体是什么类型不能确定
? extends T的作用:
- 在List中不能使用add方法
- 可以在初始化时,指定不同的类型
- 这样就能读取出不同类型的数据
? super T
- ? super T可以往里存数据,往外取数据只能放在Object对象中
? super T只能添加T类型和T类型的子类,不能添加T类型的父类,读取出来的东西只能存放在Object类里
- 下界规定了元素的最小粒度的下限,放宽了容器元素的类型控制
- 因为元素是T的基类,所以往里存比T 小的都可以
- 出于类型安全的考虑,可以往里加入T类的对象或者T类的任何子类的对象
- 由于编译器并不知道集合的内容源自T的哪一个超类,所以不允许加入特定的任何超类对象
在读取时,编译器不知道是什么类型的情况下,只能返回Object对象
- 因为Object是任何Java类的最终父类
- 这时,元素的类型信息全部丢失
PECS原则
PECS原则: Producer Extends Consumer Super
- 频繁往外读取内容的,适合使用上界Extends
- 经常往里插入内容的,适合使用下界Super
总结
- extends可以用于返回类型限定
- super可以用于参数类型限定,不能用于返回类型限定
- ? 既不能用于方法参数传入,也不能用于方法返回
- 带有extends子类型限定的通配符可以向泛型对象进行读取
- 带有super超类型限定的通配符可以向泛型对象中进行写入