Scala: сравнение свежих объектов - PullRequest
3 голосов
/ 08 октября 2009

Я просматривал тесты Scala и не понимаю, почему компилятор выдает предупреждение при сравнении «двух свежих объектов».

Это тестовые 'выходы: http://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/neg/checksensible.check

Пример:

checksensible.scala:12: warning: comparing a fresh object using `!=' will always yield true
println(new Exception() != new Exception())
                        ^

Если я напишу класс, реализующий метод ==, он также выдаст следующее предупреждение:

class Foo(val bar: Int) {
    def ==(other: Foo) : Boolean = this.bar == other.bar
}

new Foo(1) == new Foo(1)

warning: comparing a fresh object using `==' will always yield false

РЕДАКТИРОВАТЬ : Благодаря oxbow_lakes я должен переопределить метод equals, а не ==

class Foo(val bar: Int) {
    override def equals(other: Any) : Boolean = other match { 
        case other: Foo => this.bar == other.bar
        case _ => false
    }
}

1 Ответ

14 голосов
/ 08 октября 2009

Обратите внимание, что никогда не следует переопределять метод == (вместо этого следует переопределить метод equals) Я предполагаю, что под свежим объектом Scala подразумевается новый объект без определенного equals метода.

Если вы не переопределите equals, сравнение == является сравнительным сравнением (т. Е. С использованием eq) и, следовательно,

new F() == new F()

всегда будет ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...