键入与lambda不匹配

时间:2015-01-06 02:04:53

标签: java java-8

以下代码:

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

1 个答案:

答案 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...();