Java <;有什么用?扩展E>;
在使用泛型时,我遇到了声明Java <;有什么用?扩展E>;,java,generics,collections,wildcard,Java,Generics,Collections,Wildcard,在使用泛型时,我遇到了声明。 以集合接口的addAll方法为例 其宣言如下: interface Collection<E> { public boolean addAll(Collection<? extends E> c); } 错误: 对于类型List 我还读了O'Reilly的“Java泛型和集合” 一般来说,若一个结构包含一种形式的元素?扩展E,我们可以将元素从结构中取出,但不能将元素放入结构中 所以我的问题是,当我们不能用这个来修改这个
<?扩展E>
。
以集合接口的addAll方法为例
其宣言如下:
interface Collection<E> {
public boolean addAll(Collection<? extends E> c);
}
错误:
对于类型List所以我的问题是,当我们不能用这个来修改这个东西时,那有什么用呢?如果该集合是子类型,则仅从该集合中获取元素?这意味着addAll方法允许任何扩展E类的对象集合。 例如,如果G扩展了E,则可以向该集合添加一个G数组 所以我的问题是,当我们不能用这个来修改这个东西时,那有什么用呢?如果它是一个子类型,就从该集合中获取元素 是的,没错。只是为了从中获取元素
请记住,
collection您是否尝试过搜索?这一定是以前问过的。是的,我问过。但是没有问题包括我问过的问题,我知道这个通配符的用法,但我的问题是,当我们无法添加/更改现有集合时,为什么要使用它。我没有收到任何编译错误。我认为add不会以这种方式工作。无法在此集合中添加数组。从技术上讲,通过声明,我唯一能清楚看到的是collections类中Sort方法的用法。集合实现静态类。Sort是其中一种语法:publicstatic
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