【发布时间】:2015-05-16 13:36:32
【问题描述】:
我正在尝试在 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);
}
这失败了,因为函数方法有一个类型参数。 (具体来说,带有 lambda 表达式的行给出了错误:“Illegal lambda expression: Method apply of type ChurchNumeral is generic”。)
根据对功能接口使用泛型的相关问题的回答,我尝试对类进行参数化:
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.
}
第一个 lambda 表达式现在可以编译,但第二个失败并出现以下错误:
方法 apply(UnaryOperator, capture#1-of ?) 在 类型 ChurchNumeral 不适用于参数 (一元运算符,对象)
此外,我不希望每个可能的函数/参数类型都有不同版本的 ChurchNumeral.ZERO。
有什么建议吗?
【问题讨论】:
标签: java generics lambda java-8 church-encoding