gpt4 book ai didi

按类型划分的 Kotlin 扩展函数

转载 作者:行者123 更新时间:2023-12-03 01:57:43 25 4
gpt4 key购买 nike

根据类型向类添加函数的惯用方法是什么?以下示例使用 List 作为类,类型参数 <T>是列表内对象的类。假设您想根据每个列表的类型使用不同的比较器对其进行排序。

data class A(val foo: String)
data class B(val bar: Int)

private val aComparator: Comparator<A> = Comparator { lhs, rhs -> rhs.foo.compareTo(lhs.foo) }
private val bComparator: Comparator<B> = Comparator { lhs, rhs -> rhs.bar.compareTo(lhs.bar) }

fun <T: A> List<T>.sort(): List<T> {
return this.sortedWith<T>(aComparator)
}

fun <T: B> List<T>.sort(): List<T> {
return this.sortedWith<T>(bComparator)
}

这会给出一个错误,指出由于 Java 的重载规则,两个排序函数具有相同的签名。在 Java 中,我可能会给它们两个不同的可识别名称,但作为 Kotlin 扩展(例如 a.sortA() b.sortB()),它相当难看。 Kotlin 不会向 List< B > 显示 sortA,因此似乎有更好的方法编写 sort() 来处理不同对象上的不同比较器。

这个例子非常简单,但想象一下,如果我无权修改类 A 和 B,那么我就无法使用继承或在它们上实现接口(interface)。我还考虑过为每个类添加一个比较器并使用 Any?但这似乎也很麻烦。

最佳答案

一个答案似乎是:

@JvmName("sortA")
fun <T: A> List<T>.sort(): List<T> {
return this.sortedWith<T>(aComparator)
}

@JvmName("sortB")
fun <T: B> List<T>.sort(): List<T> {
return this.sortedWith<T>(bComparator)
}

这似乎解决了 Java 的泛型类型删除问题。

在这里找到:https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

关于按类型划分的 Kotlin 扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com