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

时间:2018-05-15 22:06:33

标签: kotlin

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

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

答案 1 :(得分:0)

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

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

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