kotlin - 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 类型检查器的早期版本中的一个错误,可能与无法访问的代码检测交互不良。
该错误毫无意义:nonNullName
显然是 a String
,既是因为它是显式声明的,也是因为 IDE 的类型检查确认显式类型是多余的。它不可能匹配任何其他println
函数签名。
删除该n = null
行会使错误消失,这不会影响任何变量的类型信息。
进一步加剧了这是一个错误的想法,当 Kotlin 版本设置为 1.4.10 或 1.4.20 时,它在play.kotlinlang.org上的官方在线编码环境中运行良好,但在 Kotlin 1.3.72 上中断。
要修复它,请确保您使用的是最新版本的 Kotlin。
推荐阅读
- python - 在 scikit-learn 决策树中,您如何识别导致错误分类的决策?
- php - 扩展没有命名空间的类时出现致命错误
- html - 垂直居中按钮内的十字图标
- php - 未经身份验证的响应
- reactjs - 减少 TypeScript
- java - arrayImpOfStack.java 如何在输出中反转数字?
- android - 缺少 Google VR SDK 文件夹
- mysql - 使用派生值列查看
- javascript - 无法从 TokenProvider commercetools/sdk-auth 获取 access_token 和 token_type
- python - 如何将 Django 与 Azure Cosmos DB 连接