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() 已经是扩展函数,而不是成员函数。 文件没有说明在这里发生了什么,但似乎合理的假设,本地延伸胜。


我不认为有什么方法可以改变这种行为。 这很可能是最好的,因为在许多情况下(即难以理解的行为)这违反了最不惊人的原则。