考虑这个java类:
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
public class NumberSet {
private Collection<? extends Number> numbers;
public NumberSet(Collection<? extends Number> numbers) {
this.numbers = numbers;
}
public NumberSet(NumberSet other) {
//copy other.numbers to this.numbers
numbers = new LinkedList<>();
for (Iterator<? extends Number> it = other.numbers.iterator(); it.hasNext();) {
numbers.add(it.next()); // Here's Syntax Error near `it.next()`
}
}
}
for
循环中存在此语法错误:
actual argument Number cannot be converted to CAP#1 by method invocation conversion
where E is a type-variable:
E extends Object declared in interface Collection
where CAP#1 is a fresh type-variable:
CAP#1 extends Number from capture of ? extends Number
我理解PECS
的含义,但我想为此类实现一个复制构造函数。将使用复制的实例作为other
的快照。任何想法?
答案 0 :(得分:5)
更改:
Collection<? extends Number> dst
致:
Collection<? super Number> dst
使用? extends
不允许添加。有一种称为Get
和Put
原则的东西。引自Generics and Collections的Philip Wadler书:
获取和放置原则:当你得到时使用扩展通配符 结构中的值,当你只放置时使用超级通配符 将值放入结构中,并且当两者都得到时不要使用通配符 并把
另请查看PECS以获得有关此现象的更常见解释。 (但是,我更喜欢GET
和PUT
原则优先于Producer
和Consumer
原则,因为它不那么令人困惑)