簡體   English   中英

如何使用通配符復制Java中的通用Collection

[英]How to copy a generic Collection in Java using wildcards

考慮這個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的快照。 任何的想法?

變更:

 Collection<? extends Number> dst 

至 :

 Collection<? super Number> dst

不允許使用? extends ? extends 有一種稱為“ GetPut原理的東西。 引用菲利普·沃德勒Philip Wadler)的《 泛型與收藏》一書:

獲取和放置原則:僅當從結構中獲取值時使用擴展通配符,僅將值放入結構中時使用超級通配符,而同時獲取和放置時不使用通配符

還可以查看PECS ,以獲得對該現象的更常見解釋。 (但是,相對於ProducerConsumer原則,我更喜歡GETPUT原則,因為它不那么令人困惑)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM