当前位置:  开发笔记 > 前端 > 正文

Kotlin扩展功能按类型

如何解决《Kotlin扩展功能按类型》经验,为你挑选了1个好方法。

基于类型向类添加函数的惯用方法是什么?以下示例使用List作为类,Type Parameter 是列表中的对象类.假设您希望根据类型使用不同的比较器对每个列表进行排序.

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

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

fun  List.sort(): List {
    return this.sortedWith(aComparator)
}

fun  List.sort(): List {
    return this.sortedWith(bComparator)
}

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

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



1> Jeremy Lyman..:

一个答案似乎是:

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

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

这似乎解决了Java与泛型类型擦除的问题.

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


它不完全是"通用类型擦除".Kotlin可以在编译时区分两个函数,因为它的签名包括泛型,也可以通过返回类型区分.Java不会使用泛型类型创建方法签名.因此,这会更改重命名它的字节代码中的实际方法名称,以便现在有两个独立的方法,不再需要通过签名进行区分.而不是一个具有明显相同签名的类上的两个重载函数.
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有