【问题标题】:java 8 interface default method return type not clearjava 8接口默认方法返回类型不清楚
【发布时间】:2018-04-28 23:24:11
【问题描述】:

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

默认方法

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

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

}

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

【问题讨论】:

  • 它不返回 void,它返回一个 lambda 表达式
  • 附带说明,您返回的函数实际上并没有组合操作,因为它只评估secondOperation,所以它与只返回@没有什么不同987654323@。也许,你想要return () -> { this.runOp(); secondOperation.runOp(); };...

标签: java lambda java-8


【解决方案1】:

您始终可以以非 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

【讨论】:

  • 谢谢,现在我可以通过镜头看到上面的 lambda 表达式了。非常感谢!
  • 另一种方式:return secondOperation::runOp;
【解决方案2】:

Opfunctional interface 即与 SAM 的接口(单个抽象方法)。

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

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

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

【讨论】:

  • 谢谢,但是这种方法的实现与将纯 void 类型作为返回类型而不使用 lambda 的方法实现不同。是否与惰性调用有关。
  • @Sal 像 static void timeOperation(Op testOp) { testOp.runOp(); } 这样的方法使用 Op 并执行它,而像 default Op combinedOp(Op secondOperation) { return ()->{secondOperation.runOp();}; } 这样的方法使用 Op 并返回另一个函数。它不执行它。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2017-05-09
  • 2018-01-28
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多