首页 > 解决方案 > 为什么要在 Kotlin 中将函数类型实现为接口

问题描述

我遇到了一些事情,一直想知道你为什么要这样做。

您通过一个简单的函数类型在 Kotlin 中实现一个接口:

“一个类可以实现一个函数类型,就好像它是一个接口一样。然后它必须提供一个名为 invoke 的运算符函数,并带有给定的签名,然后该类的实例可以分配给该函数类型的变量: "

class Divider : (Int, Int) -> Double {
    override fun invoke(numerator: Int, denominator: Int): Double = ...
}

但我为什么要这样做?为什么要以这种方式添加接口?我认为它只能添加一个功能而不是更多。或者我可以用函数体实现一个函数,而不仅仅是普通接口中的函数头,这是一个优势吗?我认为在 Java 中可以将默认方法添加到具有函数体的接口。所以也许是这样的?

标签: kotlininterfacekotlin-function-type

解决方案


作为一个类的函数可以有状态。例如,您可以存储最后一次调用并将历史记录用作缓存:

class Divider : (Int, Int) -> Double {
    val history = mutableMapOf<Pair<Int, Int>, Double>()

    override fun invoke(numerator: Int, denominator: Int): Double {
        return history.computeIfAbsent(Pair(numerator, denominator)) {
            numerator.toDouble() / denominator.toDouble()
        }
    }
}

fun main() {
    val divider = Divider()
    println(divider(1,2))
    println(divider(2,3))
    println(divider.history)
}

推荐阅读