kotlin - 为什么要在 Kotlin 中将函数类型实现为接口
问题描述
我遇到了一些事情,一直想知道你为什么要这样做。
您通过一个简单的函数类型在 Kotlin 中实现一个接口:
“一个类可以实现一个函数类型,就好像它是一个接口一样。然后它必须提供一个名为 invoke 的运算符函数,并带有给定的签名,然后该类的实例可以分配给该函数类型的变量: "
class Divider : (Int, Int) -> Double {
override fun invoke(numerator: Int, denominator: Int): Double = ...
}
但我为什么要这样做?为什么要以这种方式添加接口?我认为它只能添加一个功能而不是更多。或者我可以用函数体实现一个函数,而不仅仅是普通接口中的函数头,这是一个优势吗?我认为在 Java 中可以将默认方法添加到具有函数体的接口。所以也许是这样的?
解决方案
作为一个类的函数可以有状态。例如,您可以存储最后一次调用并将历史记录用作缓存:
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)
}
推荐阅读
- python - pandas 中的 for 循环真的很糟糕吗?我什么时候应该关心?
- react-native - 如何在表单字段中添加占位符和多行文本输入?反应原生
- java - BaseX GUI 找不到数据库——但它从控制台显示
- database - 带有按钮的 MS-ACCESS 过滤器子窗体
- c# - 使用 fakeDb 对 Sitecore 项目进行单元测试
- c++ - Quaternions and translations
- java - Java libGDX - 在运行时随机更改纹理大小的问题
- c# - 根据日期遍历列表并创建记录
- registry - 如何在崩溃后禁用应用程序弹出并启用崩溃转储
- python - 如何使用 for 循环打印一系列数字 x_1 到 x_10