我目前正在学习Kotlin,遇到了一种令我感到困惑的行为.下面这两行代码让我感到困惑:

"".equals(1) // not compile error
"" == 1 // compile error

"".equals(1)-此行编译并运行时没有任何问题.

"" == 1-但是,此行会导致编译时错误.

据我所知,在Kotlin中,==运算符被转换为对equals方法的调用.所以我很好奇为什么第一个语句被认为是有效的,而第二个语句不是,尽管这两个语句似乎都试图在字符串和Int之间进行相同的比较.

有人能解释一下Kotlin中使第一条语句编译和运行而不是第二条语句编译和运行的基本机制吗?

推荐答案

==通常最终会呼叫equals,但这并不完全等同.其中一个不等价之处是编译时类型判断,旨在捕获简单的错误.从docs人开始:

Kotlin判断值相等运算符的适用性 编译时,可能会拒绝A和B的某些类型组合. 具体地说,它使用以下基本原则.

如果A的类型和B的类型肯定是不同的,并且与子类型无关,则A==B是无效的表达式,应该导致 编译时错误.

非正式地说:这个原则意味着"没有两个子类型无关的对象可以被==视为相等".

因此,由于""1在子类型方面是不相关的,Kotlin认为您可能在编写该表达式时犯了一个错误,因此它会因编译时错误而中止.这张支票不适用于equals美元.

Kotlin相关问答推荐

Kotlin和JavaFX:绑定行为奇怪

我如何测试一个可组合组件没有显示,但如果它不存在也接受?

Kotlin stlib中是否有用于将列表<;对<;A,B&>;转换为对<;列表<;A&>,列表<;B&>;的函数

如何让 LocalDateTime.parse 拒绝 24:00 时间

如何在 Hibernate Panache 中进行部分搜索

如何使用 Either monad 并避免嵌套 flatMap

异常传播如何在 CoroutineScope.async 上工作?

为什么没有remember 的 mutableStateOf 有时会起作用?

在 kotlin 中模拟伴随对象函数

Kotlin - 当表达式返回函数类型

在 Kotlin 中使用 @Parcelize 注释时如何忽略字段

Koin Android:org.koin.error.NoBeanDefFoundException

@InlineOnly 注释是什么意思?

jetpack compose 将参数传递给 viewModel

Android Studio 4.0.0 Java 8 库在 D8 和 R8 构建错误中脱糖

哪里可以找到aapt2日志(log)?

Lint 错误:可疑的相等判断:在 Object DiffUtilEquals 中未实现 equals()

在多平台子元素中使用kapt

如何在 kotlin 中创建重复对象数组?

Kotlin - 为什么我会得到 KotlinNullPointerException