繁体   English   中英

java 8接口默认方法返回类型不清楚

[英]java 8 interface default method return type not clear

最近我开始阅读有关java8功能的内容,我遇到的一个这样的功能是

默认方法

,就概念而言,没有什么是独特的,但我偶然发现了这个代码片段,它使用lambda表达式从默认方法返回值(void)。但是我看到默认方法的返回类型是类型接口。 (我相信应该是无效的),因为默认方法中的逻辑不会返回任何内容,现在我对行为感到困惑,因为我没有看到任何编译错误,但是当我将默认方法的类型设置为void,编译器spouts( 此表达式的目标类型必须是函数接口 )错误。 有人可以解释lambda用法的这种行为。

public interface Op {
void runOp();
static void timeOperation(Op testOp) {

}

 default Op combinedOp(Op secondOperation) {
    return ()->{secondOperation.runOp();};
}
}

Op是一个功能接口,即与SAM的接口(单一抽象方法)。

combinedOp是一个默认方法,它将Op作为参数并返回Op not void 在Java中,函数接口可以用作lambda表达式或方法引用的目标类型,因此下面的代码是完全有效的:

default Op combinedOp(Op secondOperation) {
    return ()->{secondOperation.runOp();};
}

此代码使用一个Op ,然后返回一个函数,该函数在被调用时将执行secondOperation函数。

您始终可以使用包含单个抽象方法实现的匿名类以非lambda方式编写lambda表达式。

应用于您的示例,您可以编写该方法

default Op combinedOp(Op secondOperation) {
    return ()->{secondOperation.runOp();};
}

以这样的非lambda方式:

default Op combinedOp(Op secondOperation) {
    return new Op() {
        @Override
        public void runOp() {
            secondOperation.runOp();
        }
    };
}

现在可以更清楚地看到combinedOp方法返回一些东西,即Op接口的一个实例。

但是,此实例的runOp方法不返回任何内容。 因此它的返回类型是void

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM