当我使用泛型时,我遇到了声明 < ? extends E>
。
如果以集合接口的addAll方法为例。
它的声明如下:
interface Collection<E> {
public boolean addAll(Collection<? extends E> c);
}
从addAll的声明中,我理解(从不同来源阅读所得):
? extends E
表示可以添加具有任何E子类型元素的集合的所有成员
下面我们来看一个例子:
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints; // now this line works
/*
*without using ? syntax above line did not use to compile earlier
*/
List<Double> doubleList = new ArrayList<Double>();
doubleList.add(1.0);
nums.addall(doubleList); // compile time error
错误:
方法addall(List< Double >)在类型为List< capture#1-of ? extends Number >的列表中未定义
我也在O'Reilly的《Java Generics and Collections》中读到过:
一般来说,如果一个结构包含了类型形式为? extends E的元素,我们可以从该结构中获取元素,但是我们不能将元素放入该结构中。
所以我的问题是,当我们不能使用这个来修改东西时,它有什么用处?只是为了从该集合中获取元素,如果它是一个子类型吗?