首页 > 解决方案 > 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?

标签: kotlin

解决方案


(P) -> Any?是 的子类型(P) -> Any,所以如果你有

fun <P>onChange(oldObj: P, newObj: P, select: (P) -> Any?, handler: (P) -> Unit)

你可以通过(P) -> Any那里。当然,重载可以有两种不同的实现,但如果行为实际上不同,这似乎是一个非常糟糕的主意:)


推荐阅读