如何在接口重写函数中返回kotlin选择器,以便compareValuesBy函数可以使用它们



我对Kotlin有些陌生,但正在尝试一些高级的东西(我想(。

我有以下接口和使用该接口的类。我的目标是允许任何类型的类扩展Syncable接口,并在SyncableWrapper中使用这些接口,这样我就可以将对象与以前版本的对象进行比较。将有各种类型的Syncable类来实现它,每个类都有一组不同的字段,这些字段将包含在比较中。

因此,我希望每个扩展Syncable的类都覆盖getSelectorsToCompareValuesBy,并返回将类对象与自身的另一个版本进行比较所需的选择器。虽然这些恰好是kotlin数据类,但我不能只使用==,因为有些属性不会包含在比较中,我希望能够根据类选择哪些包含,哪些不包含。

我不能只覆盖data class中的.equals(),因为有时我需要比较所有字段,而其他时候我需要根据我想在getSelectorsToCompareValuesBy()中返回的选择器进行比较。

interface Syncable {
fun <T> getSelectorsToCompareValuesBy(): (T) -> Comparable<T>
}
class SyncableWrapper<T: Syncable>(
val previous: T,
val changed: T
) {
fun comparePrevToChanged(): Int = compareValuesBy(previous, changed,
previous.getSelectorsToCompareValuesBy()
)
}

对于更多上下文,SyncableWrapper对象将作为@ResponseBody通过SpringBoot API传递,但这个Kotlin问题与此无关。我将运行comparePrevToChanged(),并对每个对象执行其他操作。

我试过这样的东西(当然不会编译(。。。

data class Something (
val fieldToCompareWith1: String,
val fieldToCompareWith2: String,
val fieldToCompareWith3: String,
val fieldToIgnore: String,
): Syncable {
override fun <Something> getSelectorsToCompareValuesBy(): (Something) -> Comparator<Something> {
return {
{it.fieldToCompareWith1}, {it.fieldToCompareWith2}, {it.fieldToCompareWith3}
}
}
}

我能做什么?我认为我的comparePrevToChanged()乐趣很好,我的getSelectorsToCompareValuesBy签名很好或很接近。也许我只是没有正确地重写以返回选择器,或者我的返回类型也是错误的。也许我应该重写Comparable.compareTo,忘记整件事。

但这个问题的真正本质是:你能把函数选择器作为一个参数传递吗?如果能,如何传递?

fun main() {
val wrapper = SyncableWrapper(
Something("1", "2", "3", "4"),
Something("1", "2", "3", "5")
)
println(wrapper.comparePrevToChanged()) // 0
}
interface Syncable<T> {
val comparator: Comparator<T>
}
class SyncableWrapper<T : Syncable<T>>(
val previous: T,
val changed: T
) {
fun comparePrevToChanged(): Int = previous.comparator.compare(previous, changed)
}
data class Something(
val fieldToCompareWith1: String,
val fieldToCompareWith2: String,
val fieldToCompareWith3: String,
val fieldToIgnore: String
) : Syncable<Something> {
override val comparator: Comparator<Something>
get() = compareBy({ it.fieldToCompareWith1 }, { it.fieldToCompareWith2 }, { it.fieldToCompareWith3 })
}

最新更新