主要原因可能是检查对象相等性比检查对象身份更频繁,所以它至少应该一样容易。
我还没有看到关于这方面的明确声明。但是在Kotlin In Action一书中有一个指针,由 Kotlin 团队的成员撰写。第 4.3.1 节,介绍==
操作符,首先描述了 Java 的比较并说:
在 Java 中,众所周知的做法是总是调用equals
,而众所周知的问题是忘记这样做。
在 Java 中,检查对象身份很容易:
if (firstObj == secondObj)
但是检查对象相等性更长,而且不太清楚:
if (firstObj.equals(secondObj))
— 或者更确切地说,如果您不想冒 NullPointerException 的风险:
if ((firstObj == null) ? (secondObj == null) : firstObj.equals(secondObj))
你可以看到打字和正确打字是多么痛苦。(特别是当其中一个对象是具有副作用的表达式时……)
所以很容易忘记区别,或者不介意,==
转而使用。(这可能会导致微妙、难以发现和断断续续地咬人的虫子。)
然而,Kotlin 使最常见的操作变得更容易:它的==
运算符使用 来检查对象是否相等equals()
,并且还负责检查空值。这解决了 Java 的“忘记这样做的问题”。
(虽然与 Java 代码的互操作性显然是一个主要目标,但 JetBrains 并没有限制自己试图看起来像 Java;Kotlin 尽可能地借鉴了 Java,但不害怕将事情变得更好。你可以在声明的使用val
和var
尾随类型,范围和开放性的不同默认值,处理差异的不同方式等)
Kotlin 的动机之一是解决 Java 中的许多问题。(事实上,JetBrains 对语言的比较首先列出了“Kotlin 中解决的一些 Java 问题”。)所以这似乎是改变背后的主要原因。