【发布时间】:2016-01-09 02:59:02
【问题描述】:
根据类型将函数添加到类的惯用方法是什么。以下示例使用 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 不会将 sortA 显示给 List,因此似乎有更好的方法来编写 sort() 来处理不同对象上的不同比较器。
这个例子非常简单,但想象一下,如果我无权修改 A 类和 B 类,那么我就不能使用继承或在它们上实现接口。我还考虑为每个类添加一个比较器并使用 Any?但这似乎也很麻烦。
【问题讨论】: