我试图弄清楚当覆盖现有的类函数时,使用相同签名的扩展函数 - 会生效吗?
以下是我的示例代码:
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."
}
所以:
答案 0 :(得分:3)
来自the Kotlin docs(强调不我的):
如果一个类有一个成员函数,并且定义了一个具有相同接收器类型,相同名称且适用于给定参数的扩展函数,则成员总是胜出。
您的字符串示例有效的原因是因为库提供的String.toUpperCase()
已经是扩展函数,而不是成员函数。文档没有说明这里发生的事情,但似乎有理由假设本地扩展获胜。
我无法想象有什么方法可以改变这种行为。这可能是最好的,因为在许多情况下它会违反最不惊讶的原则(即行为难以理解)。