Kotlin:当扩展函数隐藏类默认实现时?

时间:2017-08-13 13:13:49

标签: kotlin kotlin-extension

我试图弄清楚当覆盖现有的类函数时,使用相同签名的扩展函数 - 会生效吗?

以下是我的示例代码:

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."
}

所以:

  • 有什么规则?什么时候会被叫?
  • 如何覆盖此决定?有可能吗?

1 个答案:

答案 0 :(得分:3)

来自the Kotlin docs(强调我的):

  

如果一个类有一个成员函数,并且定义了一个具有相同接收器类型,相同名称且适用于给定参数的扩展函数,则成员总是胜出

您的字符串示例有效的原因是因为库提供的String.toUpperCase() 已经是扩展函数,而不是成员函数。文档没有说明这里发生的事情,但似乎有理由假设本地扩展获胜。

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