为什么 Iterator<Entry<Integer, Double> 不能转换为 Iterator<Entry<? 扩展整数, ? 扩展双精度>>



我有下面的示例代码,试图用可迭代的构建一个不可变的映射

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>>。根据我的理解,这应该是有效的,因为Integer是Integer的有效上界,Double是Double的有效上界。这里的问题是什么?我如何具体修复迭代器代码?

我需要特别修复迭代器代码,因为我正试图将另一个集合转换为如下所示的映射。我在android上使用番石榴,所以无法访问默认的番石榴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());

哦,天哪,这只很丑。

你说得对,CCD_;亚型";Entry<Integer, Double>(我认为从技术上讲,它不是一种亚型,但实际上是一种(。但是,正如你可能知道的,Iterator<Subtype>而不是Iterator<Supertype>的一个亚型。相反,您必须执行Iterator<? extends Subtype>

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

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

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

Integer不是Integer的有效上界,您不能从类a扩展类a。例如,您不能这样写:公共类Actor扩展Actor{}因此,为了解决您的问题,请像下面的Iterator<条目<?扩展编号?扩展数字>gt;

最新更新