Объект kotlin равен против объекта java, равного

Я создал класс User и при вызове равенства для двух объектов с одинаковым содержимым

println("equals = ${User("Alex", 1).equals(User("Alex", 1))}") 

выводит истину, но разве два объекта не разные?

то же самое для Java дает false:

System.out.print("equals = "+new User("Alex",1).equals(new User("Alex",1)));

Это зависит от того, как метод equals реализован внутри класса User.

BackSlash 11.04.2018 12:12

Вы действительно реализовали переопределение метода equals? На данный момент это не похоже на проблему Kotlin vs Java, не так ли.

Mena 11.04.2018 12:13

без переопределений, используя базовую реализацию, которая должна сравнивать ячейки памяти?

ir2pid 11.04.2018 12:14

@ ir2pid реализация Object.equals сравнивает ссылки. Два отдельных вызова new User не будут использовать одну и ту же ссылку, независимо от равных аргументов, переданных конструктору. Вам просто нужно правильно реализовать equals.

Mena 11.04.2018 12:20
2
4
968
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Полагаю, ваш класс User - это data class? Тогда вы получите реализацию по умолчанию для сравнения переменных-членов для equals.

так классы данных kotlin автоматически сравнивают каждую переменную-член на предмет эквивалентности?

ir2pid 11.04.2018 13:36

Да, они автоматически генерируют метод equals, который считает два экземпляра равными, если все свойства в основном конструкторе проходят проверку equals для этих двух экземпляров.

zsmb13 11.04.2018 15:50
Ответ принят как подходящий
  1. Если у вас один и тот же класс User, вы получите одинаковый результат в обоих случаях. Т.е. если ваш код Java использует Kotlin data class, он вернет true; если код Kotlin использует класс Java (или Kotlin не-data) без переопределения equals, он вернет false.

  2. В Kotlin, в отличие от Java, лучше и безопаснее писать User("Alex", 1) == User("Alex", 1). Это вызовет equals для ненулевых объектов и правильно обработает null с левой стороны, где произойдет сбой Java.

Другие вопросы по теме