如第二十五条所述,参数化类型是不可变的。类型Type1和Type2而言,不管Type1与Type2的关系,List<Type1>既不是List<Type2>的子类型,也不是也不是它的超类型。那么按理来说我们声明了 一个List<Object>的变量,应该只能把Object类型的对象放入其中,但是我们知道可以把Object的子类放入其中。
同样我们声明了一个List<Number>的变量,不仅仅可以把Number类型的对象放入其中,也可以把Integer和Long等类型的对象放入其中。
之所有可以这样做,是因为有限制的通配符给我们带来了便利。
为了获得最大限度的灵活性,要在表示生产者或者消费者的输入参数上使用通配符类型。如果某个参数既是生产社,又是消费者,那么通配符类型对你就没有什么
好处了:因为你需要的是严格的类型匹配,这是不用任何通配符而得到的。
PECS 表示 producer-extends , consumer-super
不要用通配符类型作为放回类型,也就是不要用<? extends E>等这样的类型,而是使用<E>。因为调用一个方法,我们总是希望得到一个具体的类型结果,
而不是让客户端程序员去猜应该返回一个什么样类型的结果。