kotlin - Kotlin - 带有 lambda 参数的重载函数
问题描述
假设我想要一个函数来检查两个给定对象的属性值是否不同。如果是这样,则应执行处理程序 lambda。
fun <P>onChange(oldObj: P, newObj: P, select: (P) -> Any, handler: (P) -> Unit) {
val newValues = select(newObj)
val oldValues = select(oldObj)
if (oldValues != newValues) { handler(newObj) }
}
它适用于以下用例:
data class TestObj(
val foo: String,
val bar: String? = null
)
val oldObj = TestObj(foo = "foo")
val newObj = TestObj(foo = "foo1", bar = "bar")
onChange(oldObj, newObj, { it.foo }) {
print("foo did change: ${it.foo}")
}
现在我希望能够检查是否bar
发生了变化。如果我尝试重载函数,例如
fun <P>onChange(oldObj: P, newObj: P, select: (P) -> Any?, handler: (P) -> Unit) {
...
}
编译器抛出Duplicate method name&signature
异常。
如何重载函数或修改签名以支持select
能够返回可选值的 lambda?
解决方案
(P) -> Any?
是 的子类型(P) -> Any
,所以如果你有
fun <P>onChange(oldObj: P, newObj: P, select: (P) -> Any?, handler: (P) -> Unit)
你可以通过(P) -> Any
那里。当然,重载可以有两种不同的实现,但如果行为实际上不同,这似乎是一个非常糟糕的主意:)
推荐阅读
- python - 当我设置 FLASK_ENV 时,为什么 from flask.cli import main 会失败?
- vue.js - 如何删除 vuetify 文件输入可清除图标?
- java - 迭代快速排序方法
- python - Scrapy-splash response.css() 无法获取元素
- c# - 如何使用 C# Lambda 表达式在 MongoDb 中执行全文搜索
- r - for 循环谷歌地理编码()但跳过相同的县以减少谷歌 API 查询
- encryption - 我们可以解码这个 base64 值吗
- python-3.x - 试图通过套接字获取 403 错误代码
- maven - build.xml 文件中的 maven 依赖项无法下载
- c# - 从网页获取生成的html