簡體   English   中英

為什么是迭代器<Entry<Integer, Double> 不能轉換為迭代器<Entry<? extends Integer, ? extends Double> &gt;

[英]Why Iterator<Entry<Integer, Double> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>>

我有下面的示例代碼,試圖從一個可迭代對象中構建一個不可變的映射:

ImmutableList<Entry<Integer, Double>> list = ImmutableList.of(
    new AbstractMap.SimpleEntry<Integer, Double>(4, 2d),
    new AbstractMap.SimpleEntry<Integer, Double>(16, 4d));
ImmutableMap.<Integer, Double>builder().putAll(list); // No error
ImmutableMap.<Integer, Double>builder().putAll(() -> list.stream().iterator()); // Error - cannot convert type...

Bad return type in lambda expression: Iterator<Entry<Integer, Double>> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>>收到錯誤Bad return type in lambda expression: Iterator<Entry<Integer, Double>> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>>錯誤Bad return type in lambda expression: Iterator<Entry<Integer, Double>> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>> Bad return type in lambda expression: Iterator<Entry<Integer, Double>> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>> Bad return type in lambda expression: Iterator<Entry<Integer, Double>> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>> 根據我的理解,這應該是有效的,因為 Integer 是 Integer 的有效上限,而 Double 是 Double 的有效上限。 這里有什么問題,我該如何修復迭代器代碼?

我需要特別修復迭代器代碼,因為我正在嘗試將另一個集合轉換為如下所示的地圖。 我在 android 上使用 guava,所以無法訪問默認的 guava collect() 方法(盡管我認為我可以手動實現它們,如果真的沒有其他方法可以做到這一點)。

ImmutableList<Integer> numberList = ImmutableList.of(2,4,8,12,16,24,32);
ImmutableMap.<Integer, Double>builder().putAll(() -> 
   numberList.stream().map(num -> 
       (Entry<Integer, Double>) new AbstractMap.SimpleEntry<Integer, Double>(num, Math.sqrt(num))).iterator());

哦,男孩,這個丑陋的。

你是對的那個Entry<? extends Integer, ? extends Double> Entry<? extends Integer, ? extends Double> Entry<? extends Integer, ? extends Double>Entry<Integer, Double>的“子類型”(我認為它在技術上不被稱為子類型,但實際上是一個子類型)。 但是,您可能知道, Iterator<Subtype>不是Iterator<Supertype>的子類型。 相反,您必須執行Iterator<? extends Subtype> Iterator<? extends Subtype>

所以你只需要再添加一個? extends 在那里? extends

Iterator<? extends Entry<? extends Integer, ? extends Double>>
         ^^^^^^^^^

不過,我不確定最好的方法是什么。

Integer 不是 Integer 的有效上限,您不能從 A 類擴展 A 類。例如,您不能這樣寫: Public class Actor extends Actor{ } 所以要解決您的問題,請使用 Number 代替 Integer 像這樣 Iterator<條目<? 擴展數, ?擴展數>>

暫無
暫無

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

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