假设我想要一个函数来检查两个给定对象中的属性值是否不同 . 如果是这样,应该执行处理程序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 回答
(P) -> Any?
是(P) -> Any
的子类型,所以如果你有你可以在那里传递
(P) -> Any
. 当然,有了重载你可以有两个不同的实现,但如果行为实际上是不同的,这似乎是一个非常糟糕的主意:)更改名称 . 它们具有相同的JVM签名,因为字节代码级别不存在可空类型 . 它们是在编译时强制执行的Kotlin功能 .