假设我想要一个函数来检查两个给定对象中的属性值是否不同。如果是这样,应该执行处理程序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?
答案 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
。当然,有了重载,你可以有两种不同的实现,但如果行为实际上不同,这似乎是一个非常糟糕的主意:)