【问题标题】:"Overload resolution ambiguity error" resolved with another overload“重载解析歧义错误”通过另一个重载解决
【发布时间】:2018-06-02 20:51:52
【问题描述】:

我看到了这个question

加上这行怎么会这样

fun Int.toUpperCase() = ""

这个问题

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

为这段代码消失?

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

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

【问题讨论】:

  • 确实,这是一些令人头疼的材料:)

标签: kotlin


【解决方案1】:

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

此处显示:

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

fun String.substringBefore(e: String) = "hey"

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

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多