以下代码:
scoreCombiner = (Collection<ScoreContainer> subScores) -> subScores.parallelStream()
.mapToInt(ScoreContainer::getScore)
.reduce((a, b) -> a + b);
其中scoreCombiner
是声明为
private final ToIntFunction<? super List<? super ScoreContainer>> scoreCombiner;
给我的错误Type mismatch: cannot convert from ToIntFunction<Collection<ScoreContainer>> to ToIntFunction<? super List<? super ScoreContainer>>
我无法理解。 Collection绝对是List的超级类型,ScoreContainer当然是超级类型的。任何帮助将不胜感激。
答案 0 :(得分:1)
? super List
在这种情况下很好。
例如,这将编译:
ToIntFunction<? super List<?>> f = ( (Collection<?> c) -> 0 );
ToIntFunction<? super List<?>>
是ToIntFunction
消费List<?>
,ToIntFunction<Collection<?>>
消费{。}}。
问题是列表/集合的输入。现在再次回想一下,List<? super ScoreContainer>
是任何接受ScoreContainer 的List。所以麻烦在于IntFunction<? super List<? super ScoreContainer>>
接受接受ScoreContainer 的任何List。例如,您应该能够将Collection<Object>
传递给它。
您只能分配一个lambda,例如
... = (Collection<? super ScoreContainer> subScores) -> subScores...();
但是你的lambda期待的集合真的是一个制作人。您期望它生成ScoreContainers(您在其上调用getScore
)。所以你应该被extends
限制。
ToIntFunction<? super List<? extends ScoreContainer>> scoreCombiner;
... = (Collection<? extends ScoreContainer> subScores) -> subScores...();