我目前正在学习 Kotlin,遇到了一个令我困惑的行为。这是让我困惑的两行代码:
"".equals(1) // not compile error
"" == 1 // compile error
"".equals(1)
- 此行编译并运行没有任何问题。
"" == 1
- 但是,此行会导致编译时错误。
根据我的理解,在Kotlin中,
==
运算符被翻译为对equals方法的调用。所以我很好奇为什么第一个语句被认为是有效的,而第二个语句则不是,尽管两者似乎都试图在 String 和 Int 之间进行相同的比较。
有人可以解释一下 Kotlin 中使第一个语句编译并运行而不是第二个语句的底层机制吗?
来自文档:
Kotlin 检查值相等运算符的适用性 编译时,可能会拒绝 A 和 B 的某些类型组合。 具体来说,它使用以下基本原理。
如果 A 的类型和 B 的类型绝对不同并且不通过子类型相关,则 A == B 是无效表达式,并且应该导致 编译时错误。
非正式地说:这个原则意味着“任何两个通过子类型无关的对象都不能被认为是相等的 ==”。
因此,由于
""
和 1
与子类型无关,Kotlin 认为您在编写此表达式时可能犯了一个错误,并且它会因编译时错误而中止。此检查不适用于 equals
。