首页 文章

Kotlin - 具有lambda参数的重载函数

提问于
浏览
0

假设我想要一个函数来检查两个给定对象中的属性值是否不同 . 如果是这样,应该执行处理程序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?

2 回答

  • 0

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

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

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

  • 0

    更改名称 . 它们具有相同的JVM签名,因为字节代码级别不存在可空类型 . 它们是在编译时强制执行的Kotlin功能 .

相关问题