Java中的参数类型
PECS
PECS表示 producer-extends, consumer-super
换句话说, 如果参数化类型表示一个T的生产者, 就使用<? extends T>, 如果表示一个消费者就使用<? super T>
(plus: 生产者: 从集合里面取出元素, 消费者: 把元素加入集合)
今天看见Effective java这样写, 不太理解, 就动手自己推导了一下。
class A {}
class B extends A {}
class C extends B {}
class D extends A {}
对于List<? super B>这种情况来说, 可能为
- List<B>
- List<A>
- List<Object>
而对于List<? extends B>这种情况来说, 可能为
- List<B>
- List<C>
对于super的情况, 从所有的通配情况来看,最差就是List<B>,其余情况由于是B的父类,而向上转型是隐式, 并且是安全的, 我们可以就放心的把一个B以及B的子类加入集合.
而对于extends的情况,从所有的通配的情况来看,最差就是List<C>, 这个时候我们加入B或者C, 由于向下转型是类型不安全的, 所以编译器拒绝。
对于List<?>和List<Object>的区别就可以看出了。