最近我开始阅读有关 java8 的特性,我遇到的一个这样的特性是
default method
,就概念而言,没有什么独特之处,但我偶然发现了这段代码片段,它使用 lambda 表达式从默认方法返回值(void)。但我看到默认方法的返回类型是interface. 类型(我认为应该是 void),因为默认方法中的逻辑不返回任何东西,现在我对这种行为感到困惑,因为我没有看到任何编译错误,但是当我将默认方法的类型设置为 void 时,编译器会喷出(此表达式的目标类型必须是函数式接口(interface))错误。有人可以根据 lambda 用法解释这种行为。
public interface Op {
void runOp();
static void timeOperation(Op testOp) {
}
default Op combinedOp(Op secondOperation) {
return ()->{secondOperation.runOp();};
}
}
最佳答案
你总是可以用非 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
接口(interface)的实例。
但是,此实例的 runOp
方法不返回任何内容。
因此它的返回类型是 void
。
关于java 8接口(interface)默认方法返回类型不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50081946/