Java 函数接口继承怪癖
我有一个自定义界面,我已经使用了一段时间,它看起来像这样:Java 函数接口继承怪癖,java,lambda,java-8,default-method,functional-interface,Java,Lambda,Java 8,Default Method,Functional Interface,我有一个自定义界面,我已经使用了一段时间,它看起来像这样: public interface Function<T, R> { R call(T input); } 两个超级接口声明了相同的apply()方法,该方法已在我的接口中实现,只剩下抽象call()方法。奇怪的是,它不会编译,告诉我 “@FunctionInterface”批注无效;函数不是一个函数接口 更奇怪的是,以下变体编译得很好: @FunctionalInterface public interface F
public interface Function<T, R> {
R call(T input);
}
两个超级接口声明了相同的apply()
方法,该方法已在我的接口中实现,只剩下抽象call()
方法。奇怪的是,它不会编译,告诉我
“@FunctionInterface”批注无效;函数不是一个函数接口
更奇怪的是,以下变体编译得很好:
@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);
}
}
@functioninterface
公共接口功能扩展
java.util.function.function{
R调用(T输入);
@凌驾
默认R应用(T输入){
回电(输入);
}
}
@functioninterface
公共接口功能扩展
com.google.common.base.Function{
R调用(T输入);
@凌驾
默认R应用(T输入){
回电(输入);
}
}
公共接口功能扩展
java.util.function.function,
com.google.common.base.Function{
R调用(T输入);
@凌驾
默认R应用(T输入){
回电(输入);
}
}
@functioninterface
公共接口功能扩展
java.util.function.function,
com.google.common.base.Function{
@凌驾
R应用(T输入);
}
第一个版本无法编译有什么原因吗?如评论中所述,它可以使用oracle编译器进行编译。 这是一个eclipse bug 等待bug修复,我个人将删除注释
@functioninterface
(您的第三个变体):
并让您的功能
扩展此适配器功能
:
@FunctionalInterface
public interface Function<T, R>
extends
AdapterFunction<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
您的第三个可以编译,因为您没有添加约束,即它必须是
@functional接口
(这是一个经过编译器验证的注释)。@SotiriosDelimanolis,显然。您是使用Eclipse编译的吗?使用Oracle的编译器可以很好地编译。这应该可以用javac编译。看起来像一个eclipse bug。。。。另外,我也不知道为什么要这样做——函数接口的要点是创建lambda,方法的名称并不重要。所以这个lambdaa->doSomething(a)
可以分配给3个函数中的任何一个接口…@assylias,假设我有一个方法接受我的函数
,我想重构它以接受任何Java函数
。或者说我有一个函数的实例
,我希望能够将它传递给Guava方法。是的,我发现了一个类似的错误报告。我不在乎注释本身;问题是它不允许我使用lambda表达式。我尝试了与你的适配器想法类似的东西,但没有成功。我明天再试一次。带有AdapterFunction
的解决方案也可以在eclipse中使用。但是删除@functioninterface
(第三种变体)不正确,它可以在适配器中实现apply()
。谢谢“此解决方案的主要不便之处在于无法将该函数用作lambda目标类型”=>为什么不能?您不需要将接口标记为@functional interface
或用作lambda的目标类型,只要它实际上是一个函数接口…@assylas您理论上是正确的,但实际上eclipse编译器不接受它。它只适用于oracle编译器
@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);
}
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);
}
}
public interface AdapterFunction<T, R>
extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
@Override
default R apply(T input) {
return null;
}
}
@FunctionalInterface
public interface Function<T, R>
extends
AdapterFunction<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
Function<String, Object> function = st -> st.toString();