首页 > 解决方案 > Kotlin println() 重载分辨率歧义

问题描述

我有这个代码示例

    var n: String? = "I am nullAble"
    n = null
    var nonNullName : String = "I cannot be null"
    n?.let {
        println(nonNullName)        // 1 -- OK
        
        nonNullName = n
        println(nonNullName)       //! 2 -- Kotlin: Overload resolution ambiguity
        
        var v1 : String = n
        println(v1)                 // 3 -- OK
    }

谁能向我解释为什么第二个“println(nonNullName)”不能通过编译器,为什么第三个“println(v1)”可以?
以下是来自 IntelliJ IDEA 的错误消息

Kotlin: Overload resolution ambiguity:  
public inline fun println(message: Any?): Unit defined in kotlin.io  
public inline fun println(message: Boolean): Unit defined in kotlin.io  
public inline fun println(message: Byte): Unit defined in kotlin.io  
public inline fun println(message: Char): Unit defined in kotlin.io  
public inline fun println(message: CharArray): Unit defined in kotlin.io  
public inline fun println(message: Double): Unit defined in kotlin.io  
public inline fun println(message: Float): Unit defined in kotlin.io  
public inline fun println(message: Int): Unit defined in kotlin.io  
public inline fun println(message: Long): Unit defined in kotlin.io  
public inline fun println(message: Short): Unit defined in kotlin.io  

标签: kotlin

解决方案


这似乎是 Kotlin 类型检查器的早期版本中的一个错误,可能与无法访问的代码检测交互不良。

该错误毫无意义:nonNullName显然是 a String,既是因为它是显式声明的,也是因为 IDE 的类型检查确认显式类型是多余的。它不可能匹配任何其他println函数签名。

删除该n = null行会使错误消失,这不会影响任何变量的类型信息。

进一步加剧了这是一个错误的想法,当 Kotlin 版本设置为 1.4.10 或 1.4.20 时,它在play.kotlinlang.org上的官方在线编码环境中运行良好,但在 Kotlin 1.3.72 上中断。

要修复它,请确保您使用的是最新版本的 Kotlin。


推荐阅读