Я пытаюсь реализовать церковные цифры в Java 1.8. Моя первая попытка:Как внедрить церковные цифры с использованием Java 1.8
import java.util.function.UnaryOperator;
@FunctionalInterface
public interface ChurchNumeral {
public static ChurchNumeral valueOf(int n) {
if (n < 0) {
throw new IllegalArgumentException("Argument n must be non-negative.");
}
if (n == 0) {
return (f, arg) -> arg;
}
return (f, arg) -> f(valueOf(n-1).apply(f, arg));
}
<T> T apply(UnaryOperator<T> f, T arg);
}
Это не работает, потому что функциональный метод имеет параметр типа. (В частности, строки с лямбда-выражениями дают ошибку: «Нелегированное выражение лямбда: метод применяется к типу ChurchNumeral является общим».)
На основании ответов на связанные вопросы об использовании дженериков с функциональными интерфейсами я попытался параметризовать класс:
import java.util.function.UnaryOperator;
@FunctionalInterface
public interface ChurchNumeral<T> { // This line changed.
public static ChurchNumeral<?> valueOf(int n) { // This line changed.
if (n < 0) {
throw new IllegalArgumentException("Argument n must be non-negative.");
}
if (n == 0) {
return (f, arg) -> arg;
}
return (f, arg) -> f(valueOf(n-1).apply(f, arg));
}
T apply(UnaryOperator<T> f, T arg); // This line changed.
}
Первая лямбда-выражение в настоящее время составляет, но второй один терпит неудачу с этой ошибкой:
The method apply(UnaryOperator, capture#1-of ?) in the type ChurchNumeral is not applicable for the arguments (UnaryOperator, Object)
Кроме того, я не хочу иметь различные версии ChurchNumeral.ZERO для всех возможного FUNC/аргумент.
Любые предложения?
Спасибо. FYI, я смог удалить «rawtypes» из @SuppressWarnings, заменив бросок на ChurchNumeralT на приведение к ChurchNumeralT . –