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