2015-01-06 7 views
2

поэтому следующий код:Несоответствие типа с лямбда

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>>, которую я не могу понять. Коллекция определенно является супертипом List, а ScoreContainer, конечно, является супертипом самого себя. Любая помощь будет оценена по достоинству.

ответ

1

? 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>.

Можно назначить только лямбду, такие как

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

Но Сборник вашей лямбды ожидающая действительно производитель. Вы ожидаете, что он будет производить ScoreContainers (который вы называете getScore). Таким образом, вы должны быть ограничены extends.

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

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

Спасибо! Теперь я чувствую себя глупо ... Я должен был понять, что коллекция является продюсером, хотя функция является потребителем. – Dimitriye98

Смежные вопросы