考虑这个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()`
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我理解其含义,PECS但我想为这个类实现一个copy-constructor.复制的实例将被用作快照other.任何的想法?
变化:
Collection<? extends Number> dst
Run Code Online (Sandbox Code Playgroud)
至 :
Collection<? super Number> dst
Run Code Online (Sandbox Code Playgroud)
不允许使用添加? extends.有一个被称为Get和Put原则的东西.引自Philip Wadler的Generics and Collections一书:
获取和放置原则:当您只从结构中获取值时使用扩展通配符,当您仅将值放入结构时使用超级通配符,并且当您同时获取和放置时不使用通配符
另请参阅PECS以获得有关此现象的更常见解释.(不过,我更喜欢GET和PUT原则,在Producer和Consumer原则,因为它是减少混乱)
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |