Предположим, я хочу иметь функцию, которая проверяет, отличается ли значение свойства в двух заданных объектах. Если это так, то должен быть выполнен обработчик лямбды.
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
лямбда-выражения, которое может возвращать необязательный параметр?