Основная причина, вероятно, заключается в том, что равенство объектов проверяется гораздо чаще, чем идентичность объектов, поэтому это должно быть как минимум так же просто.
Я не видел однозначного утверждения по этому поводу. Но в книге 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 начинается с перечисления «Некоторые проблемы Java, решаемые в Kotlin».) Таким образом, вполне вероятно, что это является основной причиной изменений.