首页 文章

“过载分辨率模糊度错误”通过另一个过载解决

提问于
浏览
3

我看到了question .

怎么能添加这条线

fun Int.toUpperCase() = ""

这个问题

错误:(6,16)重载分辨率歧义:@InlineOnly public inline fun Char.toUpperCase():在kotlin.text中定义的char @InlineOnly public inline fun String.toUpperCase():在kotlin.text中定义的字符串

为这段代码消失了吗?

fun main(args: Array<String>){
    var ab: String? = "hello"
    ab = null
    println(ab?.toUpperCase())
}

给出参考问题的答案是有道理的,它只是不回答这里发生的事情 .

1 回答

  • 0

    如果再次在文件中定义 fun String.toUpperCase() = "" ,它甚至可以工作 . 编译器选择要使用的本地定义函数,不再考虑模糊函数 . 由于 ab 变为 Nothing? 并且这是所有可空类型的子类型,因此任何接收器都会实现这一点 .

    如图所示:

    fun main(args: Array<String>) {
        println("hello".substringBefore("e"))
    }
    
    fun String.substringBefore(e: String) = "hey"
    

    不会调用来自stdlib的 substringBefore ,因为使用了本地定义的扩展名 .

相关问题