Kotlin:当扩展函数隐藏类的默认实现?
我试图找出当重写一个现有的类功能,具有相同签名的扩展功能 – 将生效?
这是我的示例代码:
fun String.toUpperCase(): String = "ext. function impl." fun main(args: Array<String>) { println("Hello".toUpperCase()) // ext. function impl. println(MyClass().toUpperCase()) // class impl. } class MyClass { fun toUpperCase() : String { return "class impl." } } fun MyClass.toUpperCase() : String { return "ext. function impl." }
所以:
- 什么是规则? 什么时候会被叫?
- 我怎样才能覆盖这个决定? 可能吗?
从Kotlin文档 ( 不是我的重点):
如果一个类有一个成员函数,并且定义了一个具有相同接收器类型,相同名称并适用于给定参数的扩展函数,则该成员总是获胜 。
字符串示例工作的原因是因为库提供的String.toUpperCase()
已经是扩展函数,而不是成员函数。 文件没有说明在这里发生了什么,但似乎合理的假设,本地延伸胜。
我不认为有什么方法可以改变这种行为。 这很可能是最好的,因为在许多情况下(即难以理解的行为)这违反了最不惊人的原则。
- 用Kotlin关闭/隐藏Android软键盘
- 我需要知道为什么? 如果我把这行改为“println(name + two)”错误解决?
- NotificationManager.setInterruptionFilter不适用于某些电话
- 调用java中java关键字的kotlin函数?
- 注释Kotlin中的属性时,注释的默认目标是什么?
- 在运行应用程序时,Intellij不包括对classpath的gradle依赖
- 如何将Gson类型适配器转换为Klaxon类型适配器
- Kotlin Dagger2找不到符号ApplicationModule_ProvideApplicationFactory
- 从Spark + Kotlin的POST正文获取JSON数据