Kotlin:当扩展函数隐藏类的默认实现时?
我试图弄清楚,当使用相同签名的扩展函数重写现有的类函数时,它会生效吗 以下是我的示例代码:Kotlin:当扩展函数隐藏类的默认实现时?,kotlin,kotlin-extension,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 im
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."
}
fun String.toUpperCase():String=“ext.function impl。”
趣味主线(args:Array){
println(“Hello”.toUpperCase())//ext.function impl。
println(MyClass().toUpperCase())//类impl。
}
类MyClass{
fun toUpperCase():字符串{
返回“类impl”
}
}
有趣的MyClass.toUpperCase():字符串{
返回“ext.function impl.”
}
因此:
- 规则是什么?什么时候会打电话
- 我怎样才能推翻这个决定?可能吗
- 来自(重点不是我的):
如果一个类有一个成员函数,并且定义了一个具有相同接收器类型、相同名称且适用于给定参数的扩展函数,成员始终获胜
字符串示例之所以有效,是因为提供的库
string.toUpperCase()
已经是一个扩展函数,而不是成员函数。文档没有说明这里发生了什么,但似乎有理由假设本地扩展获胜
我想没有办法改变这种行为。这可能是最好的,因为它在许多情况下违反了最小惊讶原则(即难以理解的行为)。这种行为实际上在
kotlin stdlib
(例如)中的一些地方发生了改变,但这是通过kotlin.internal.HidesMembers
实现的,显然,内部工具,不适用于第三方代码。这是永远的。