[英]Incompatible generic type for result returned by Java iterator
我有一個對象,它是Map的一種,並且我正在嘗試使用迭代器對其進行迭代。 但是,我無法通過編譯,代碼如下。
// Returned from other method, and the run time type is Map<String, B>
Map<String, ? extends A> map = ...
// Option 1: cannot pass.
Iterator<Map.Entry<String, ? extends A>> iterator = map.entrySet().iterator();
// Option 2: cannot pass either.
// Where B is a subclass extends from A
Iterator<Map.Entry<String, B>> iterator = map.entrySet().iterator();
有人可以幫我嗎? 謝謝。
我建議您使用foreach循環,而不是直接使用Iterator
Map<String, ? extends A> map = new HashMap<>();
for (Map.Entry<String, ? extends A> entry : map.entrySet()) {
String key = entry.getKey();
A value = entry.getValue();
}
如果您真的想將Iterator
存儲在變量中,請不要使用此變量
// ERROR
Iterator<Map.Entry<String, ? extends A>> iterator = map.entrySet().iterator();
您必須這樣做:
Iterator<? extends Map.Entry<String, ? extends A>> iterator = map.entrySet().iterator();
額外的原因? extends
? extends
是嵌套在Map.Entry<String, ? extends A>
的通配符Map.Entry<String, ? extends A>
Map.Entry<String, ? extends A>
聲明。 如果您有類型的變量
Iterator<Map.Entry<String, ? extends A>>
那么原則上每個條目都可以具有A的不同子類型的值,因此每個Map.Entry
都可以具有不同的類型。 相比之下,
Iterator<? extends Map.Entry<String, ? extends A>>
表示每個條目都是單一類型。 (但是您不知道它是什么類型,因為它是通配符。)
實際上,這對於Iterator
無關緊要,因為您只獲得Map.Entry<String, ? extends A>
類型的對象Map.Entry<String, ? extends A>
Map.Entry<String, ? extends A>
。 但是,如果您有其他類型可以將內容放入其中(例如Set
),則差異會很大。 例如,
Set<? extends Map.Entry<String, ? extends A>>
只允許從集合中獲取條目,但是
Set<Map.Entry<String, ? extends A>>
將允許將條目添加到集合中,並且這些條目可能包含A的不同子類型,從而可能污染集合。
有關此的進一步討論,請參見
以及以下堆棧溢出問題:
我這應該做的把戲
for (Map.Entry<String, ? extends A> entry : map.entrySet())
{
String key = entry.getKey();
A value = entry.getValue();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.