[英]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.