Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:当扩展函数隐藏类的默认实现时?_Kotlin_Kotlin Extension - Fatal编程技术网

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
      实现的,显然,内部工具,不适用于第三方代码。这是永远的。