簡體   English   中英

Java迭代器返回的結果的通用類型不兼容

[英]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.

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