Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 函数接口继承怪癖_Java_Lambda_Java 8_Default Method_Functional Interface - Fatal编程技术网

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,方法的名称并不重要。所以这个lambda
a->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();