所以下面的代码:
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<?>>
是消耗ToIntFunction
的List<?>
,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)?