类型与 lambda 不匹配

Type mismatch with lambda

所以下面的代码:

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

在这种情况下 ? super List 没问题。

例如这将编译:

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

ToIntFunction<? super List<?>>ToIntFunction 消耗 List<?>ToIntFunction<Collection<?>> 消耗 ToIntFunction<Collection<?>>

问题出在 List/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)?