类型与 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)?
所以下面的代码:
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)?