所以下面的代码:

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当然是List本身的超类型。任何帮助,将不胜感激。

最佳答案

在这种情况下,? super List很好。

例如,它将编译为:

ToIntFunction<? super List<?>> f = ( (Collection<?> c) -> 0 );


ToIntFunction<? super List<?>>是消耗ToIntFunctionList<?>ToIntFunction<Collection<?>>会这样做。

问题是列表/集合的类型。再次回想一下,List<? super ScoreContainer>是任何接受ScoreContainer的列表。因此,这里的问题是IntFunction<? super List<? super ScoreContainer>>接受任何接受ScoreContainer的列表。因此,例如,您应该能够将其传递给Collection<Object>

您只能分配一个lambda,例如

... = (Collection<? super ScoreContainer> subScores) -> subScores...();


但是lambda期望的Collection确实是生产者。您期望它产生ScoreContainers(在其上称为getScore)。因此,您应该受extends的限制。

ToIntFunction<? super List<? extends ScoreContainer>> scoreCombiner;

... = (Collection<? extends ScoreContainer> subScores) -> subScores...();



What is PECS (Producer Extends Consumer Super)?

09-10 13:22