如何使用 Kotlin 接口中定义的扩展函数

Mat*_*fek 1 interface kotlin

在 Kotlin 中,可以在接口中声明扩展函数,如下所示:

interface Evaluator {
  fun Double.evaluateY1(): Double
  fun Double.evaluateY2(): Double
}

class EvaluatorImpl : Evaluator {
    override fun Double.evaluateY1(): Double {
        return this + 2.0
    }

    override fun Double.evaluateY2(): Double {
        return this + 3.0
    }
}
Run Code Online (Sandbox Code Playgroud)

有了接收器和接口实例,我如何调用这样的扩展函数?

我想出了一个涉及with范围函数的技巧,但我更喜欢缩进较少的东西。

fun usageExample(evaluator: Evaluator, x: Double) {
  with(evaluator) {
    println("Y1 = ${x.evaluateY1()}. Y2 = ${x.evaluateY2()}")
  }
}
Run Code Online (Sandbox Code Playgroud)

s1m*_*nw1 5

如果不进入界面范围,就不可能让它工作。使用with是推荐的解决方案。您可以使用表达式主体使其更加简洁:

fun usageExample(evaluator: Evaluator, x: Double) = with(evaluator) {
    println("Y1 = ${x.evaluateY1()}. Y2 = ${x.evaluateY2()}")
}
Run Code Online (Sandbox Code Playgroud)