【发布时间】:2015-08-18 12:22:57
【问题描述】:
我有一个使用了一段时间的自定义界面,看起来像这样:
public interface Function<T, R> {
R call(T input);
}
我想用 Java 的 Function 和 Guava 的 Function 来改造这个接口,同时保持它的 FunctionalInterface。我以为我有完美的安排:
@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
两个超接口都声明了相同的apply()方法,在我的接口中已经实现了,只剩下抽象的call()方法。奇怪的是,它不会编译,告诉我
'@FunctionalInterface' 注释无效; Function
不是函数式接口
更奇怪的是,以下变体编译得很好:
@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
@FunctionalInterface
public interface Function<T, R> extends
com.google.common.base.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
@Override
R apply(T input);
}
第一个版本无法编译是否有原因?
【问题讨论】:
-
第三个编译成功,因为您没有添加它必须是
@FunctionalInterface的约束(这是编译器验证的注释)。 -
@SotiriosDelimanolis,很明显。
-
你在用 Eclipse 编译吗?用 Oracle 的编译器编译得很好。
-
这应该编译并且确实使用 javac 编译。看起来像一个 Eclipse 错误.... 另外我不确定您为什么要这样做 - 功能接口的主要目的是创建 lambda,方法的名称无关紧要。所以这个 lambda
a -> doSomething(a)可以分配给 3 个 Functions 接口中的任何一个... -
@assylias,假设我有一个接受我的
Function的方法,我想重构它以接受任何JavaFunction。或者说我有一个Function的实例,我希望能够将它传递给 Guava 方法。
标签: java lambda java-8 default-method functional-interface