这是java的泛型语法,E表示泛型具现时使用的类,而? extends E则表示E的子类或者E的实现。
一开始接触的问题是,为什么需要? extends E这样的语法?
例如一个List<Number> numbList的add方法自然可以接受Number的子类,包括Double或者Integer。所以在add的参数只需要是add(E)就可以了,不需要add(? extends E)。
这是因为addAll方法的需要,addAll(Collection<? exntends E>)在这个接口里,如果使用addAll(Collection<E>)是不接受List<Double>作为参数的,这是因为按照官方的说法,java的泛型是“invariant”的。一个List<Double>不是一个List<Number>,确实一个List<? extends Number>。
值得注意的是,数组不一样,一个Double[]是一个Number[]。