【问题标题】:Why Iterator<Entry<Integer, Double> cannot be converted to Iterator<Entry<? extends Integer, ? extends Double>>为什么 Iterator<Entry<Integer, Double> 不能转换为 Iterator<Entry<?扩展整数,?扩展双>>
【发布时间】:2021-12-20 22:45:36
【问题描述】:

我有下面的示例代码尝试从可迭代对象中构造不可变映射:

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&lt;Entry&lt;Integer, Double&gt;&gt; cannot be converted to Iterator&lt;Entry&lt;? extends Integer, ? extends Double&gt;&gt;。根据我的理解,这应该是有效的,因为 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());

【问题讨论】:

    标签: java guava


    【解决方案1】:

    Integer 不是 Integer 的有效上限,您不能从 A 类扩展 A 类。例如,您不能这样写: 公共类 Actor 扩展 Actor{ } 因此,要解决您的问题,请像这样 Iterator>

    【讨论】:

    • Oracle docs 表示上限匹配类型和任何子类型:“上限通配符, extends Foo>,其中 Foo 是任何类型,匹配 Foo 和 Foo 的任何子类型。”
    【解决方案2】:

    天哪,这个太丑了。

    你说得对,Entry&lt;? extends Integer, ? extends Double&gt;Entry&lt;Integer, Double&gt; 的“子类型”(我认为它在技术上不称为子类型,但实际上是一个)。但是,您可能知道,Iterator&lt;Subtype&gt;不是Iterator&lt;Supertype&gt; 的子类型。相反,您必须这样做 Iterator&lt;? extends Subtype&gt;

    所以你只需要在其中再添加一个? extends

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

    不过,我不确定最好的方法是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多