Я думаю, что несоответствие вызвано неправильным объявлением второго параметра foldLeft
. Если в вашем примере Integer
является аргументом Iteratble
, то ваш метод должен быть объявлен так:
static <U, V> V foldLeft(V e, Iterable<V> l, BiFunction<V, U, V> f) {
return null;
}
V
- это тип элемента итерируемого, а не U
(что в данном случае эквивалентно Iterable<V>
).
Кроме того, ваш вызов должен выглядеть следующим образом:
Integer u = foldLeft(0, l, func);
Вы не можете вызвать выражение в Java. Если func
не объявлен как метод в видимой области видимости, func()
всегда будет недействительным.
Обратите внимание, что вы можете упростить свои генерики, избавившись от U
(я не вижу определенная c потребность в переменной типа для типа списка здесь, но я могу пропустить некоторые варианты использования):
static <V> V foldLeft(V e, Iterable<V> l, BiFunction<V, Iterable<V>, V> f) {
return null;
}
Вы не показываете свою реализацию foldLeft
, но я конечно, нужно будет перебрать список или, по крайней мере, передать его f.apply
. Поэтому я полагаю, что вы можете заставить функцию принимать List<V>
:
static <V> V foldLeft(V e, List<V> l, BiFunction<V, List<V>, V> f) {
return f.apply(e, l);
}
В противном случае вызов f.apply(e, l)
завершится неудачно, поскольку Function<Integer, LinkedList<Integer>, Integer>
и Function<Integer, Iterable<Integer>, Integer>
несовместимы.