[英]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
。 有一種稱為“ Get
和Put
原理的東西。 引用菲利普·沃德勒 ( Philip Wadler)的《 泛型與收藏》一書:
獲取和放置原則:僅當從結構中獲取值時使用擴展通配符,僅將值放入結構中時使用超級通配符,而同時獲取和放置時不使用通配符
還可以查看PECS ,以獲得對該現象的更常見解釋。 (但是,相對於Producer
和Consumer
原則,我更喜歡GET
和PUT
原則,因為它不那么令人困惑)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.