最近,我开始阅读关于java8特性的文章,其中一个类似的特性是
默认方法
在概念方面没有什么独特之处,但是我偶然发现了这个代码片段,它使用lambda表达式从默认的method.but返回值( void)。我看到默认方法的返回类型是类型接口(我认为它应该是空的),因为默认方法中的逻辑不返回任何东西,现在我对这种行为感到困惑,因为我没有看到任何编译错误,但是当我将默认方法的类型设置为void时,编译器输出(这个表达式的目标类型必须是一个函数接口)错误。有人能向lambda的用法解释一下这种行为吗?
public interface Op {
void runOp();
static void timeOperation(Op testOp) {
}
default Op combinedOp(Op secondOperation) {
return ()->{secondOperation.runOp();};
}
}发布于 2018-04-28 23:55:38
您可以使用包含单个抽象方法实现的匿名类以非lambda的方式编写lambda表达式。
应用到示例中,可以编写方法。
default Op combinedOp(Op secondOperation) {
return ()->{secondOperation.runOp();};
}以一种非蓝氏的方式:
default Op combinedOp(Op secondOperation) {
return new Op() {
@Override
public void runOp() {
secondOperation.runOp();
}
};
}现在可以更清楚地看到,combinedOp方法返回某些内容,即Op接口的实例。
但是,此实例的runOp方法不返回任何内容。因此,它的返回类型是void。
发布于 2018-04-28 23:34:42
Op是一个功能接口,即与SAM (单一抽象方法)的接口。
combinedOp是一个默认的方法,它以一个Op作为参数,并返回一个Op,而不是空的。在Java中,函数接口可以用作lambda表达式或方法引用的目标类型,因此下面的代码是完全有效的:
default Op combinedOp(Op secondOperation) {
return ()->{secondOperation.runOp();};
}此代码使用一个Op,然后该secondOperation返回一个函数,当调用该函数时,该函数将执行secondOperation函数。
https://stackoverflow.com/questions/50081946
复制相似问题