如何使用通配符在Java中复制泛型集合

Mos*_*ari 5 java generics

考虑这个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.任何的想法?

CKi*_*ing 5

变化:

 Collection<? extends Number> dst 
Run Code Online (Sandbox Code Playgroud)

至 :

 Collection<? super Number> dst
Run Code Online (Sandbox Code Playgroud)

不允许使用添加? extends.有一个被称为GetPut原则的东西.引自Philip WadlerGenerics and Collections一书:

获取和放置原则:当您只从结构中获取值时使用扩展通配符,当您仅将值放入结构时使用超级通配符,并且当您同时获取和放置时不使用通配符

另请参阅PECS以获得有关此现象的更常见解释.(不过,我更喜欢GETPUT原则,在ProducerConsumer原则,因为它是减少混乱)