java 8接口(interface)默认方法返回类型不明确

标签 java lambda java-8

最近我开始阅读有关 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/

相关文章:

java - Comparator.comparing 使用嵌套对象的字段对列表进行排序

python - 尝试将具有两个序列的嵌套循环转换为 lambda

java - 如何知道项目是用什么版本的JDK开发的?

python - 使用内部类输入类型调用 AWS lambda 函数

java - 如何在 Flowable.generate 中使 Files.lines AutoCloseable

java - Android String.split ("") 返回额外的元素

java - 编译器错误 : "class, interface, or enum expected"

Java 8 使用 stream() 将 List<Object> 提取/转换为 Map<String, List<String>>

java - 如何在java中将字符串abcdefghijklmnop转换为4x4矩阵?

带有小程序的 Java ProcessBuilder