E 和 ? extends E的区别

和? extends E

 

这是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[]。

参考:http://stackoverflow.com/questions/2770264/what-is-the-difference-between-e-extends-number-and-number

原文地址:https://www.cnblogs.com/zhanglanyun/p/2807541.html