我有下面的示例代码,试图用可迭代的构建一个不可变的映射
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;